gpt4 book ai didi

c++ - -fno-elide-constructors 是否包含在 -O0 或任何其他优化级别中?

转载 作者:行者123 更新时间:2023-11-30 04:09:41 24 4
gpt4 key购买 nike

-fno-elide-constructors 是否包含在 -O0 或任何其他 -O[其他级别] 中?

在我看来,-fno-elide-constructors 是一个优化标志,-O 是优化级别。因此,某些 -O 级别可能包含标志 -fno-elide-constructors。我说得对吗?

也就是说,-fno-elide-constructors和-O..有什么关系吗?

最佳答案

In other words, is there relationships between -fno-elide-constructors and -O..?

是的,这是有关系的,虽然很简单:gcc 很可能会省略已经在 -O0 级别的构造函数,除非您明确禁用它。请参阅底部的示例代码以获取证明。

虽然这很棘手,编译器可以做一些非常讨厌的事情,参见 RVO force compilation error on failure .底线是:您始终需要检查生成的程序集以了解幕后真正发生的事情。

请记住(from Working Draft, Standard for ProgrammingLanguage C++, N3797,这是我能找到的最接近 C++14 的近似值):

12.8/31 When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the constructor selected for the copy/move operation and/or the destructor for the object have side effects. [...]


证实我的陈述的代码:

#include <cstdio>
constexpr int size = 1024;

struct A { int array[size] = { 0 }; };

int main() {
A a = A();
std::printf("%d\n", a.array[size-1]);
}

使用g++ -std=c++11 -Wall -O0 -S elide.cpp,在生成的汇编代码中只有一个

    call    A::A()

但是,使用 g++ -std=c++11 -Wall -O0 -fno-elide-constructors -S elide.cpp 我得到:

    call    A::A()
[...]
call A::A(A&&)

即使您使用 -O0 禁用优化,如果您出于某种原因需要禁用它,您仍然必须另外禁用省略。

关于c++ - -fno-elide-constructors 是否包含在 -O0 或任何其他优化级别中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21070513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com