0

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

struct blank {
    int : 0;
};

编译器会在运行时优化它吗?

我问是因为这个相当流行的 SO question。我想在我自己的 C/C++ 代码中使用类似的编译时检查。我正在尝试使程序尽可能优化,因此如果我只想将它们用于编译时检查,我不希望这些空结构在运行时徘徊。

附带说明一下,是否有一种 C++ 惯用的方式来实现与链接中相同的结果?

4

3 回答 3

5

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

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

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

static_assert( condition, "Error: condition was false." );
于 2013-02-22T00:41:20.857 回答
2

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

在实践中,跨模块边界传递struct实例的地址是在 RAM 中实现实例的一种非常可靠的方法,其大小至少为一个字节(除非整个程序优化器捕获它)。使用 thisstruct作为另一个structor中成员的类型也是如此class

于 2013-02-22T00:34:32.460 回答
2

空结构保证有自己的地址,但仅此而已:您不会花时间构建它(毕竟,它是空的;没有什么可构建的)。

做同样事情的 C++ 惯用方式是使用static_assert(在符合 C++11 标准的编译器中可用)。

于 2013-02-22T00:40:55.550 回答