Wie erkennt man die Verwendung von std::string SSO (Short-String-Optimierung)?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie erkennt man die Verwendung von std::string SSO (Short-String-Optimierung)?

Post by Anonymous »

Wenn ich eine lange Zeichenfolge habe:

Code: Select all

std::string data("This is a string long enough so that it is not a short string");
Und dann habe ich einen Blick auf diese Zeichenfolge:

Code: Select all

std::string_view dataView(std::begin(data) + 5, std::end(data) - 5);
Wenn ich die Originalzeichenfolge verschiebe:

Code: Select all

std::string movedData(std::move(data));
Dann würde ich erwarten, dass die Ansicht „dataView“ gültig bleibt.
Diese Annahme gilt jedoch nicht, wenn die kurze String-Optimierung std::string wirksam wird, da der zugrunde liegende Speicher des Strings nicht dynamisch zugewiesen wird und die Verschiebung jetzt (unter der Haube) zu einem destruktiven Kopiervorgang wird, wodurch die Ansicht ungültig bleibt.
Gibt es eine Möglichkeit, SSO zu erkennen (damit ich in meiner Klasse entsprechende Maßnahmen ergreifen kann). Konstruktor verschieben)? Und verweist der Standard auf SSO?
Kontext
Ich habe eine Klasse, die eine URL als Zeichenfolge enthält, und der Zugriff auf jeden Teil der URL erfolgt dann als Ansichten der ursprünglichen URL. Natürlich ist die Berechnung der Aufrufe mit Kosten verbunden, aber es ist besser, sie einmal zu berechnen als bei jedem Zugriff (das war zumindest mein Denkprozess). Für eine Kopie haben Sie die Ansichten neu berechnet, aber bei einer Verschiebung (dachte ich) müssen die Ansichten nicht neu berechnet werden, da der zugrunde liegende Speicher verschoben wird und die Ansichten somit weiterhin gültig sind.

Code: Select all

 class URL
{
std::string      url;
std::string_view schema;
std::string_view host;
std::string_view path;
// .. etc (for the multiple parts of a URL you can extract).
// Note: Parsing a URL correctly is non-trivial (handling IPV6, etc.).
//       So I don't want to do it that often.

public:
// Default constructor.
URL() {}
// Normal constructor: Accept input by copy/move
URL(std::string urlInput)
: url(std::move(urlInput))
{
// Compute Views.
}
// Copy constructor.
URL(URL const& copy)
: url(copy.url)
{
// Compute Views.
}
// Move constructor
// I hoped I could simply swap the two objects.
// This works if there is no short string optimization.
URL(URL&& move) noexcept
{
swap(move);
}
// Assignment (both copy and move in one place).
// Use standard copy and swap idium.
URL operator=(URL assign) noexcept
{
swap(assign);
return *this;
}
// Faithful swap function.
void swap(URL& other) noexcept
{
using std::swap;
swap(url, other.url);
swap(schema, other.schema);
swap(host,   other.host);
swap(path,   other.path);
}

// Getter functions removed. But simply return std::string_view.
};

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post