Что такое оптимизация компилятора g cc? - PullRequest
0 голосов
/ 11 апреля 2020

Я мог бы подумать о 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 *? Спасибо,

1 Ответ

0 голосов
/ 11 апреля 2020

Компилятору не разрешено изменять вызов конструктора копирования с помощью вызова конструктора перемещения, так как он должен следовать правилам языка (обратите внимание, что если методы обычно ожидают semanti c, они являются только обычными методами, которые могут быть не эквивалентны ожидаемое семанти c (я вижу класс матрицы, где operator++() и operator++(int) ведут себя по-разному, один ряд увеличения, другой столбец, поэтому it++; не может быть заменен на ++it; для оптимизации)).

Единственное допустимое изменение поведения - разрешение копирования / перемещения (конструктор) в определенных случаях. и так как C ++ 14 новое выражение .

То, что он может сделать, это оптимизация, следуя правилу как будто . поэтому любые изменения, которые не влияют на наблюдаемое поведение (ввод-вывод, изменчивый доступ). «синхронизация» не является наблюдаемым поведением, я имел в виду, если вы печатаете истекшее время кода, это не запрещает оптимизацию этого кода.

3.) У нас есть серия «theSameString»

компилятор разрешен, но не обязателен для этого.

  • "hello world" == "hello world" может вернуть true или false.
  • "hello world" + 6 == "world" может возвращать true или false.

(помните, мы сравниваем здесь указатели, а не содержимое).

...