Code: Select all
std::string data("This is a string long enough so that it is not a short string");
Code: Select all
std::string_view dataView(std::begin(data) + 5, std::end(data) - 5);
Code: Select all
std::string movedData(std::move(data));
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.
};
Mobile version