c++ - 了解 32 位 C 编译器中的 sizeof(char)

标签 c++ c sizeof

(sizeof) char 在 32 位 GCC 编译器中总是返回 1

但是由于32位编译器的基本 block 大小是4,那么在基本大小为4字节的情况下,char如何占用单个字节???

考虑以下几点:

struct st 
{
int a;
char c;
};

sizeof(st) 返回 8 与默认的 4 字节 block 大小一致(因为分配了 2 个 block )

我永远无法理解为什么当分配一个大小为 4 的 block 时 sizeof(char) 返回为 1

有人能解释一下吗???

我会非常感谢任何解释它的回复!!!

编辑:“位”的错字已更改为“字节”。我向第一次编辑的人问对不起。我回滚了 EDIT,因为我没有注意到 U 所做的更改。 感谢所有指出必须改变它的人,尤其是@Mike Burton 否决了这个问题,感谢@jalf 似乎对我对概念的理解得出了结论!

最佳答案

sizeof(char) 始终为 1。始终。您所说的“ block 大小”只是机器的 native 字大小 - 通常是导致最有效操作的大小。您的计算机仍然可以单独寻址每个字节 - 这就是 sizeof 运算符告诉您的内容。当您执行 sizeof(int) 时,它会返回 4 来告诉您 int 在您的机器上是 4 个字节。同样,您的结构是 8 个字节长。 sizeof 没有关于一个字节中有多少位的信息。

您的结构长度为 8 个字节而不是 5 个字节(如您所料)的原因是编译器正在向结构中添加 padding 以使所有内容都与该原生字长很好地对齐,再次提高效率。大多数编译器为您提供了pack 结构的选项,可以使用 #pragma 指令或其他编译器扩展,在这种情况下,您可以强制结构采用最小尺寸,无论您的机器的字长如何。

char 是大小 1,因为这是您的计算机可以处理的最小访问大小 - 对于大多数机器来说是 8 位值。 sizeof 运算符为您提供所有其他数量的大小,单位为与您询问的任何大小相同的 char 对象的数量。出于性能原因,编译器会将 填充(参见下面的链接)添加到您的数据结构中,因此在实践中它比您从结构定义中想象的要大。

维基百科上有一篇文章叫做 Data structure alignment里面有很好的解释和例子。

关于c++ - 了解 32 位 C 编译器中的 sizeof(char),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451266/

相关文章:

c++ - 不正确的插值,opengl索引的vbo,顶点结构和glsl

c - semget : how to avoid concurrent access to semaphore group on its creating/initialization?

c - 关于getchar()函数的有趣实践

c++ - sizeof 运算符如何计算函数返回类型的大小?

c - 为什么 sizeof(int) 小于 -1?

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

c++ - 在 Qt 中显示窗口而不窃取焦点

c++ - 由于 Tab 键顺序,鼠标光标总是得到错误的 hwnd - MFC 应用程序

c++ - 以下reinterpret_cast是否会导致未定义的行为?

C 更改数组的索引表示