Как noexcept в C ++ меняет сборку? - PullRequest
2 голосов
/ 27 июня 2019

Как noexcept в C ++ меняет сборку? Я попробовал немного с маленькими функциями, в Godbolt, но сборка не изменилась .

float pi() 
//noexcept // no difference
{ return 3.14; }

int main(){
    float b{0};
    b = pi();
    return 0;
}

Я ищу минимальный рабочий пример, где я вижу изменения в сборке из-за noexcept.

1 Ответ

2 голосов
/ 27 июня 2019

Довольно простые примеры могут быть построены , которые напрямую связаны с деструкторами, а не с самоанализом в noexcept состоянии:

void a(int);
void b() noexcept;
void c(int i) {
  struct A {
    int i;
    ~A() {a(i);}
  } a={i};
  b();
  a.i=1;
}

Здесь noexcept позволяет игнорировать инициализацию a в вызывающей стороне , поскольку деструктор не может ее наблюдать.

struct B {~B();};
void f();
void g() noexcept {
  B b1;
  f();
  B b2;
}

Здесь noexcept позволяет пропустить информацию о кадре, необходимую в случае, если callee выбрасывает. Это зависит от (очень распространенного) решения не раскручивать стек при вызове std::terminate.

...