当前位置:  技术问答>linux和unix

问个简单问题散点分

    来源: 互联网  发布时间:2016-09-08

    本文导语:  昨天去面试,面试官用一系列内存对齐问题把我问的哑口无言。看来我的水平还是不行啊,回来搜了下相关文章,大概明白了些,但有些问题还是混乱的,望大家指教。 union D {     char a[5];     int  b;      }; ...

昨天去面试,面试官用一系列内存对齐问题把我问的哑口无言。看来我的水平还是不行啊,回来搜了下相关文章,大概明白了些,但有些问题还是混乱的,望大家指教。

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)。

|
把握住两点:
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或者指针,就会有区别了。
其实我是来接分的……

|
接分 回复内容     

|
围观。。。

|
好吧,我来学习加接分!

|
sizeof(test_t)和编译器有关

|
每天发个贴,健康一整年

|
呵呵,顶4楼和13楼,关键还是看编译器
顺便接分~

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 简单问题简单问题简单问题简单问题
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • 小问题,急问题,重大问题!!!
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 弱弱的一问,linux下的中文问题及网络问题,分不是问题
  • 八个问题帮你快速了解Docker
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
  • 网页的编码问题!或者java的编码问题,由此引出一条解决中文问题的思路
  • nginx Windows版相关问题及使用说明
  • 死锁的问题 多级锁定问题 循环锁定问题
  • vs2010下禁用vmware的方法以及解决vmware插件导致vs2010变慢的问题
  • [问题]双系统出现的问题!求问题的原因和解决办法!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 初学者问题。一个是编译hello world的问题,一个是配置ssh的问题
  • c/c++服务器程序内存泄露问题分析及解决
  • C程序问题:哪个高手帮我解释下下面的问题,主要是a[0]和&[0] 的区别 和编译器的问题??
  • ​部署 Docker 前必须问自己的四个问题
  • swing的问题还是jbuiler的问题??
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • 菜鸟第一次安装红帽子7.2的一箩筐问题。每个问题会开个帖子,各放100分!请有安装经验的老鸟们帮忙解决。第二个问题:什么是LILO?怎么样


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3