C++ &引用;编译器将为变量留出4个字节,即使变量本身只需要1个字节;是这样吗?

C++ &引用;编译器将为变量留出4个字节,即使变量本身只需要1个字节;是这样吗?,c++,operating-system,C++,Operating System,这是一个c++代码片段。它显示空类的实例大小为1。 但我想知道的是。如果考虑内存对齐,并且每个对象或变量都分配在内存区域,该内存区域从4的倍数开始。我们可以说instance_a的大小是1字节,但实际上占用了4个字节(我的意思是编译器将为变量留出4个字节,即使变量本身只需要1个字节),因为后面的3个字节不会是其他变量的内存区域的一部分(编译器不会触及它,因为大多数时候它有更好的选择) A类{}; int main(){ 实例_A=A(); 库特 我们可以说实例_a的大小是1字节,但实际上占用了4

这是一个
c++
代码片段。它显示空类的实例大小为
1
。 但我想知道的是。如果考虑内存对齐,并且每个对象或变量都分配在内存区域,该内存区域从4的倍数开始。我们可以说
instance_a
的大小是1字节,但实际上占用了4个字节(我的意思是编译器将为变量留出4个字节,即使变量本身只需要1个字节),因为后面的3个字节不会是其他变量的内存区域的一部分(编译器不会触及它,因为大多数时候它有更好的选择)

A类{};
int main(){
实例_A=A();
库特
我们可以说实例_a的大小是1字节,但实际上占用了4字节吗

否。对象占用的内存量是其大小。这可能与其成员大小之和不同,但即使对于POD对象也是如此。这种差异通常是由于您所描述的对齐要求造成的。字节除了将成员对齐或将对象大小填充到某个目标之外没有其他功能值称为“填充”。它们是对象表示的一部分

让我们只关注对象实例_a,而忽略a[]数组。是否有可能
实例_a
的尾随3个字节将成为其他对象内存区域的一部分

否。如果
实例a
的大小为4,则所有四个字节都属于该对象。部分或全部可以与其成员共享,但不与非其成员的对象共享,除非
实例a
是联合的成员

我的话不够准确。“编译器将为变量留出4个字节,即使变量本身只需要1个字节。”


编译器将保留一个精确的
大小为实例a
字节的连续区域,用于表示
实例a
。这是
实例a
所需的字节数,即使其中一些字节是填充的。通常,可能存在或可能不存在位于紧邻位置的其他对象的存储,但E存储不相关的对象将不会重叠存储<代码> StistangsA < /C>。如果代码< > StistangsA < /C>是2个或更多个元素的数组的成员,将有至少一个对象立即存储。

不,你不能说任何类似的东西。你的C++编译器有一个关于如何对齐的最后一个词。de>A[2]
占用2个字节或8个字节或其他什么?这也取决于编译器。否。编译器可能会为该类型分配比
sizeof
更多的内存,但标准并不要求这样做。实际上,如果结构类型对齐要求是4个字节,大多数当前编译器默认情况下会将类型的大小调整为避免这样的事情(即,他们将填充放在类型中,而不是放在它的实例之后)。但是,这也是编译器实现中的一个选择。“让我们只关注对象
实例a
”——如果您想关注
实例a
,可能您想编辑来自“[…]的问题,每个对象或变量都被分配了。”[…]”到“[…]每个变量都被分配[…]”?如果我理解您想要的问题,您可能需要重新考虑您的单词选择。一个“占用”4个字节的变量表示该变量扩展到填充所有4个字节。我想您的意思更像是“占用”4个字节或“需要”4个字节;这更接近于建议编译器为变量留出4个字节,即使变量本身只需要1个字节。(或者不尝试将所有含义压缩到一个单词中。)