它将在 DEV c++ 编译器上给出输出 28 我期望 26 考虑 float 为 4 字节 int 为 4 字节,char 为 1 字节 [重复]
Posted
技术标签:
【中文标题】它将在 DEV c++ 编译器上给出输出 28 我期望 26 考虑 float 为 4 字节 int 为 4 字节,char 为 1 字节 [重复]【英文标题】:It will give the output 28 on DEV c++ compiler I am expecting 26 considering float as 4 byte int as 4 byte and char as 1 byte [duplicate] 【发布时间】:2016-03-16 23:51:11 【问题描述】:struct
int m,s,l;
union
char c[10];
;
float p;
a;
int main()
printf("%d",sizeof(a));
return 0;
根据计算 ans 必须是 4*3+10+4=26 但 DEV C++ 编译器显示输出 28。
【问题讨论】:
请重新编辑:没问题,损坏的代码格式,作为单个元素联合的明显奇怪的细节。 【参考方案1】:所有系统在栈上分配局部变量的原则大致相同
1 -- 堆栈从高地址向低地址增长
2 -- 变量在程序中的声明顺序对应堆栈的增长
3 -- 每种类型都有对齐方式 - 任何变量的地址都必须能被它的大小整除(1 表示 char,2 表示简称等)。尽量少浪费空间
这样,我们尝试利用一些浪费的空间来提高内存访问的速度。 所以在你的代码中,它意味着
#include <stdio.h>
#include <stdlib.h>
struct // the base address is &a
int m; // [0, 4)
int s; // [4, 8)
int l; // [8, 12)
union
char c[10]; // [12, 22)
;
// char m_align[2] // there are 4 byte for align
float p; // [24, 28)
a; // sizeof = 28
m
的值是a
类型的开头,在32位系统中占用4个字节,所以它的地址是[0, 4)。并且它的起始地址可以被sizeof(int)整除。
这与s
和l
相同。
然后是联合值c[10]
occupancy,occupancy [12, 22),它的起始地址 12 可以被 sizeof(int) 整除。
下一个地址是22,值p
会占用sizeof(float) = 4
字节,但是地址22不能被sizeof(float)
整除。我们必须填充空间以对齐结构并尝试浪费尽可能少的空间。所以p
的基地址是24,可以被sizeof(float)
整除,所以p
的地址是[24, 28]...
你可以看到这个https://en.wikipedia.org/wiki/Data_structure_alignment了解详情
【讨论】:
【参考方案2】:结构中的成员在 32 位处理器中排列为一组 4 个字节。所以你得到 28 个字节的大小。 更多详情见here 这是由于填充
【讨论】:
以上是关于它将在 DEV c++ 编译器上给出输出 28 我期望 26 考虑 float 为 4 字节 int 为 4 字节,char 为 1 字节 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
C++:如何在 Windows 10 上使用编译器 MinGW 9.2.0 安装 OpenCV