(sizeof)char总是在32位GCC编译器中返回1.
但由于32位编译器的基本块大小为4,当基本大小为4字节时,char如何占用单个字节?
考虑以下因素:
struct st
{
int a;
char c;
};
Run Code Online (Sandbox Code Playgroud)
sizeof(st)返回为8,默认块大小为4字节(因为分配了2个块)
我永远无法理解为什么sizeof(char)在分配大小为4的块时返回为1.
有人可以解释一下吗???
我会非常感谢任何回复解释它!
编辑:'bits'的拼写错误已更改为'bytes'.我对第一次编辑的人抱歉.我回滚了编辑,因为我没有注意到你做的改变.感谢所有那些指出必须改变的人,尤其是@Mike Burton,因为他们对这个问题进行了抨击,并且@jalf似乎对我对概念的理解得出了结论!
Car*_*rum 23
sizeof(char)始终是1.永远.您所谈论的"块大小"只是机器的本机字大小 - 通常是导致最有效操作的大小.您的计算机仍然可以单独处理每个字节 - 这就是sizeof操作员告诉您的内容.当你这样做时sizeof(int),它会返回4,告诉你int机器上有4个字节.同样,您的结构长度为8个字节.没有sizeof关于字节中有多少位的信息.
你的结构长8个字节而不是5个(正如你所料)的原因是编译器正在为结构添加填充,以便使所有内容与原生字长保持良好对齐,同样为了提高效率.大多数编译器都允许您使用指令或其他编译器扩展来打包结构,#pragma在这种情况下,您可以强制您的结构采用最小的大小,而不管机器的字长.
char大小为1,因为这是您的计算机可以处理的最小访问大小 - 对于大多数机器而言是8位值.该sizeof运营商为您提供所有其他量在许多单位如何大小char的物体会因为无论你问相同的尺寸.由于性能原因,编译器会将填充(请参阅下面的链接)添加到您的数据结构中,因此在实践中它比您在查看结构定义时想象的要大.
有一个维基百科文章称为数据结构对齐,它有一个很好的解释和例子.
示例结构对齐的示例代码:
struct st
{
int a;
char c;
};
struct stb
{
int a;
char c;
char d;
char e;
char f;
};
struct stc
{
int a;
char c;
char d;
char e;
char f;
char g;
};
std::cout<<sizeof(st) << std::endl; //8
std::cout<<sizeof(stb) << std::endl; //8
std::cout<<sizeof(stc) << std::endl; //12
Run Code Online (Sandbox Code Playgroud)
它的大小struct大于其各个组件的总和,因为它被32位编译器设置为可被4个字节整除.这些结果可能在不同的编译器上有所不同,特别是如果它们在64位编译器上.
| 归档时间: |
|
| 查看次数: |
17664 次 |
| 最近记录: |