Как noexcept в C ++ меняет сборку?

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

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

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

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

1
задан Jonas Stein 26 June 2019 в 23:35
поделиться

1 ответ

Могут быть построены довольно простые примеры , которые напрямую связаны с деструкторами, а не с самоанализом статуса 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 позволяет пропускать информацию кадра, необходимую в случае, если вызываемый абонент выбрасывает. Это зависит от (очень распространенного) решения не раскручивать стек при вызове std::terminate.

2
ответ дан Davis Herring 26 June 2019 в 23:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: