Начиная с C++20, стандартная библиотека использует оператор космического корабля для реализации сравнения строк и векторов (согласно этому видео). Я обеспокоен тем, что это может привести к значительному снижению производительности!
Позвольте мне объяснить на примере оператора != для строки:
Когда я пишу str1 != str2, компилятор преобразует это в (str1 str2) != 0.
Однако эффективная реализация != для строки сначала проверил бы str1.size() != str2.size(), и только в случае неудачи перешел бы к сравнению фактических символов.
Эта оптимизация не может быть реализована для оператора космического корабля, так как ему в любом случае придется определять «большую» строку.
Итак, если это правда, как сейчас сравниваются строки на предмет неравенства, разве это не огромная потеря производительности?
Начиная с C++20, стандартная библиотека использует оператор космического корабля для реализации сравнения строк и векторов (согласно этому видео). Я обеспокоен тем, что это может привести к значительному снижению производительности! Позвольте мне объяснить на примере оператора != для строки: [list] [*]Когда я пишу str1 != str2, компилятор преобразует это в (str1 str2) != 0. Однако эффективная реализация != для строки сначала проверил бы str1.size() != str2.size(), и только в случае неудачи перешел бы к сравнению фактических символов.[*]Эта оптимизация не может быть реализована для оператора космического корабля, так как ему в любом случае придется определять «большую» строку. [/list] Итак, если это правда, как сейчас сравниваются строки на предмет неравенства, разве это не огромная потеря производительности?
Начиная с C++20, стандартная библиотека использует оператор космического корабля для реализации сравнения строк и векторов (согласно этому видео). Я обеспокоен тем, что это может привести к значительному снижению производительности!
Позвольте мне...
Я получил старый класс, который нуждается в операции сравнения, потому что мы хотим заказать его его членами в порядке членов. struct old_class {
std::string a;
std::optional b;
std::optional c;
Новый оператор делает написание кода более удобным и может сэкономить некоторую производительность, если алгоритм сравнения нетривиален, поскольку его не нужно повторять два раза, чтобы получить результат. полный заказ.
Я пытаюсь определить оператор космического корабля для простого строкового класса шаблона.
namespace mylib
{
template
struct String
{
String()
{
*data = '\0';
}