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