如果我定义了一个结构,如下所示:
struct blank {
int : 0;
};
编译器会在运行时将其优化为空吗?
因为this rather popular SO question我问。我想在我自己的C / C ++代码中使用类似的编译时检查。我正在尝试使程序尽可能最佳,所以如果我只是将它们用于编译时检查,我不希望这些空结构在运行时闲置。
另一方面,是否有一种C ++ - 惯用的方式来实现与链接相同的结果?
答案 0 :(得分:5)
C ++仅允许在对象实现基类时进行优化。 (因此它被称为空基优化或EBO。)对于一个独立的对象,或作为另一个struct
的成员,它必须至少有一个字节大,即使该字节只是填充。
至于链接问题中的结构,不要担心。那里没有对象,只有一种类型。即使有一个对象,它也会被链接器剥离。除非您特别要求导出所有内容,否则未引用的函数和全局对象不会进入可执行文件。即使在这种情况下,它仍然可能需要保留一个名称。
正如其他人所提到的,C ++ 11的做法是static_assert
。它需要一条错误消息:
static_assert( condition, "Error: condition was false." );
答案 1 :(得分:2)
取决于。如果as-if rule可以完全消除此结构的所有实例,则编译器可以执行该优化。编译器是否这样做取决于它是哪个编译器,也可能取决于优化器设置。
实际上,将struct
实例的地址传递到模块边界是一种非常可靠的方法,可以在RAM中实现大小至少为一个字节的实例(除非整个程序优化器捕获它)。因此,使用此struct
作为另一个struct
或class
中成员的类型。
答案 2 :(得分:2)
空结构保证有自己的地址,但这就是它:你不会花时间构建它(毕竟,它是空的;没有什么可以构建的。)
C ++惯用的方法是使用static_assert
(在符合C ++ 11标准的编译器中可用)。