Я мог бы подумать о 3 случаях, компилятор мог бы представлять как CSP, а затем оптимизировать, однако я не знаю, так ли это. Я не предполагаю заданного c флага оптимизации компилятора, однако, чтобы обеспечить оптимизацию, можно предположить, что заданы флаги -O2 или -O3.
1) передача самих аргументов вместо копирования, если аргументы не используются после вызова функции
void aFunction(std::string aStr);
...
std::string aString = makeAString(anIntegerInput);
size_t mqSize = aString.size();
aFunction(aString); // or a class method like aClass->aFunction(aString);
std::cout << "Size : " << mqSize << std::endl
, так как aString не используется после вызова функции. Это может логически вывести, что вместо копирования aString компилятор перемещает строку (подпись aFunction не является строкой && - здесь это не операция перемещения)? Будет ли принудительно задавать входной параметр aFunction std :: string && aStr?
2) Здесь создается объект T с конструктором по умолчанию, а затем конструктор копирования, используемый для инициализации значений Map.
template<typename T>
void aMethod(std::map<std::string, T>& p, const std::vector<std::string>& aVec) {
p.clear();
T t;
for (auto it = aVec.begin(); it != aVec.end(); ++it) {
p[*it] = t;
}
}
Компилятор может обнаружить, что объект "t" является только созданным по умолчанию объектом и вместо копирования может инициализировать значения карты p конструкторами по умолчанию.
3) У нас есть серия "theSameString"
std::map<std::string, int> temp{{"john", 5}, {"anna", 7}};
int aValue = temp.find("john");
int anotherValue = temp.find("john");
int yetAnotherValue = temp.find("john");
здесь, компилятор создает 4 разных структуры данных типа "john" const char *, или для каждой создаваемой const char * проверяет предыдущие структуры данных const char *? Спасибо,