当前位置: 技术问答>linux和unix
问个简单问题散点分
来源: 互联网 发布时间:2016-09-08
本文导语: 昨天去面试,面试官用一系列内存对齐问题把我问的哑口无言。看来我的水平还是不行啊,回来搜了下相关文章,大概明白了些,但有些问题还是混乱的,望大家指教。 union D { char a[5]; int b; }; ...
昨天去面试,面试官用一系列内存对齐问题把我问的哑口无言。看来我的水平还是不行啊,回来搜了下相关文章,大概明白了些,但有些问题还是混乱的,望大家指教。
概括了下,大概是这几个问题:
1. sizeof(test_t) 是多少?
2. sizeof(test_t)在linux,unix,windows上是否有区别?
3.sizeof(test_t)在32位机和64位机上是否有区别?
4.sizeof(test_t)和编译器是否有关系?
union D
{
char a[5];
int b;
};
struct test_t {
int a;
char b;
char c[10];
D d;
short e;
};
概括了下,大概是这几个问题:
1. sizeof(test_t) 是多少?
2. sizeof(test_t)在linux,unix,windows上是否有区别?
3.sizeof(test_t)在32位机和64位机上是否有区别?
4.sizeof(test_t)和编译器是否有关系?
|
1. 在32bit平台,64bit平台上,有些C的数据类型有区别。
2. 编译器对结构体对齐,默认是4 bytes对齐。
3. 结构体对齐原则:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
2. 编译器对结构体对齐,默认是4 bytes对齐。
3. 结构体对齐原则:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
|
把握住两点:
1. 内存对齐是编译器决定的东西,不是操作系统,更不是CPU
2. sizeof()是编译器内部做的事情,也就是说,sizeof()是文法,不是函数
OK, 下面的问题就好解决了
1. sizeof(test_t) 是多少?
见4楼,很详细,不再复述了
2. sizeof(test_t)在linux,unix,windows上是否有区别?
不同系统上的编译器有可能不同,所以结果当然也可能不同, 其实这个和操作系统无关
3.sizeof(test_t)在32位机和64位机上是否有区别?
32位编译器和64位编译器不同,所以结果可能不同
4.sizeof(test_t)和编译器是否有关系?
只和编译器有关, 我要是开心,做个编译器,写死sizeof()的值为1,那么所有变量的sizeof()都是1
1. 内存对齐是编译器决定的东西,不是操作系统,更不是CPU
2. sizeof()是编译器内部做的事情,也就是说,sizeof()是文法,不是函数
OK, 下面的问题就好解决了
1. sizeof(test_t) 是多少?
见4楼,很详细,不再复述了
2. sizeof(test_t)在linux,unix,windows上是否有区别?
不同系统上的编译器有可能不同,所以结果当然也可能不同, 其实这个和操作系统无关
3.sizeof(test_t)在32位机和64位机上是否有区别?
32位编译器和64位编译器不同,所以结果可能不同
4.sizeof(test_t)和编译器是否有关系?
只和编译器有关, 我要是开心,做个编译器,写死sizeof()的值为1,那么所有变量的sizeof()都是1
|
只接分 可以么?
|
我承认,我是接分的
|
4楼 Good job!
|
|
union D
{
char a[5];
int b;
/* padding 3 bytes, 使unin的总长度为 4bytes*2倍=8bytes */
};
struct test_t
{
int a; /* 4 bytes, 注意,默认是4bytes对齐 */
char b; /* 1 bytes */
char c[10]; /* 10 bytes */
/* padding 3 bytes, 例D的开始偏移地址为 15+1=16 bytes */
union D d; /* 8 bytes */
short e; /* 2 bytes, padding 8 bytes, 才能使 test_t的总体大小符合 10的整数倍,即(26+2bytes节填充长度)=28bytes */
/* 编译器自动在此处填充2bytes, 注意到此结构体的最大基本类型是int型,即结构体的总长度是int型长度的整数度 */
};
概括了下,大概是这几个问题:
1. sizeof(test_t) 是多少?
28
2. sizeof(test_t)在linux,unix,windows上是否有区别?
可能有区别,因为linux支持多种硬件平台,例如:arm, mips, x86, power pc等。
3.sizeof(test_t)在32位机和64位机上是否有区别?
没区别。
4.sizeof(test_t)和编译器是否有关系?
有。
|
赞4楼~~
|
我是顶贴的!嘿嘿,学习下
|
都答完了,我来接分。。。
|
进来学习的
|
顶你啊!
|
sizeof(test_t)和编译器当然有关系。你用Turbo C来编译肯定不一样,他的int是2字节。
32位和64位系统的int都是4字节,所以结果应该一样。如果其中有long或者指针,就会有区别了。
其实我是来接分的……
32位和64位系统的int都是4字节,所以结果应该一样。如果其中有long或者指针,就会有区别了。
其实我是来接分的……
|
接分 回复内容
|
围观。。。
|
好吧,我来学习加接分!
|
sizeof(test_t)和编译器有关
|
每天发个贴,健康一整年
|
呵呵,顶4楼和13楼,关键还是看编译器
顺便接分~
顺便接分~
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。