编译器是否优化大小为0的结构?

时间:2013-02-22 00:31:54

标签: c++ struct compiler-optimization compile-time

如果我定义了一个结构,如下所示:

struct blank {
    int : 0;
};

编译器会在运行时将其优化为空吗?

因为this rather popular SO question我问。我想在我自己的C / C ++代码中使用类似的编译时检查。我正在尝试使程序尽可能最佳,所以如果我只是将它们用于编译时检查,我不希望这些空结构在运行时闲置。

另一方面,是否有一种C ++ - 惯用的方式来实现与链接相同的结果?

3 个答案:

答案 0 :(得分:5)

C ++仅允许在对象实现基类时进行优化。 (因此它被称为空基优化或EBO。)对于一个独立的对象,或作为另一个struct的成员,它必须至少有一个字节大,即使该字节只是填充。

至于链接问题中的结构,不要担心。那里没有对象,只有一种类型。即使有一个对象,它也会被链接器剥离。除非您特别要求导出所有内容,否则未引用的函数和全局对象不会进入可执行文件。即使在这种情况下,它仍然可能需要保留一个名称。

正如其他人所提到的,C ++ 11的做法是static_assert。它需要一条错误消息:

static_assert( condition, "Error: condition was false." );

答案 1 :(得分:2)

取决于。如果as-if rule可以完全消除此结构的所有实例,则编译器可以执行该优化。编译器是否这样做取决于它是哪个编译器,也可能取决于优化器设置。

实际上,将struct实例的地址传递到模块边界是一种非常可靠的方法,可以在RAM中实现大小至少为一个字节的实例(除非整个程序优化器捕获它)。因此,使用此struct作为另一个structclass中成员的类型。

答案 2 :(得分:2)

空结构保证有自己的地址,但这就是它:你不会花时间构建它(毕竟,它是空的;没有什么可以构建的。)

C ++惯用的方法是使用static_assert(在符合C ++ 11标准的编译器中可用)。