面试的时候经常遇到数据类型字节大小,字节对齐的问题,现整理如下

笔试给出的问题没有说明是32位还是16位,也没有说明编译器版本,这让用过gcc,同时又用过vc++的人是有点为难了,面试的时候又有点紧张,所以会把不同编译器的数据类型大小混淆了。
思维还是不够清晰啊!!!!!
面试的时候,我怎么就记得有char是两个字节的编译器呢?????天哪!!!我自己都不好意思了。。
现在整理如下:资料摘自网络

在32位机上,int通常是32位;在16位机上,int通常是16位(由编译器决定,而编译器通常是根据代码运行的目标机来决定)。
所以,int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的): 
1 sizeof(short int)<=sizeof(int) 
2 sizeof(int)<=sizeof(long int) 
3 short int至少应为16位(2字节) 
4 long int至少应为32位。 

TC里面 int 就是 2个字节,而VC++里面就是4个字节,gcc里面也是4个字节。 
还有long long int 在TC里面是 4 个字节,gcc里面是 8 个字节。
-----------------------------------------------------------------------------------------------------
常用数据类型对应字节数
 可用如sizeof(char),sizeof(char*)等得出
char :1个字节
char*(即指针变量):
2个字节(16位编译器)
4个字节(32位编译器)
8个字节(64位编译器)
short int: 2个字节
int/unsigned int:
2个字节(16位编译器)
4个字节(32/64位编译器)
long int: 4个字节
float: 4个字节
double: 8个字节
long/unsigned long:
4个字节(16/32位编译器)
8个字节(64位编译器)
long long: 8个字节

 
----------------------------------------------------------------------------------------------------------------------------------------------------------

引言:结构对齐的目的是为了加快CPU取数据时的速度,不同的编译器有不同的标准,有关于4字节对齐的,也有关于8字节对齐的,解题时需跟据环境具体分析。  
  环境:ubuntu10.10 gcc 
  判断结构大小,只需要注意两点即可:  
1.分析结构成员: 
    小于4字节的结构成员,相对起始地址要在成员大小的倍数上 Char   1              char 类型可以从任何地址开始 
Short   2             short 类型需要相对结构起始地址以 2 的倍数处开始 Int     4 
大于4  4 对齐   如 double 大小为 8字节,只需按4字节对齐即可  
2.整个结构要关于最大的成员大小对齐(不大于4) 
   如果结构最大的成员是 short 那么结构的大小应是 2 的倍数,(不足时在结构末尾补足)    如果最大成员是 int ,则应是 4 的倍数。 
   如果是 double ,则是 4 的倍数。 为什么是 4 的倍数? 
   这是GCC默认的对齐大小,可以修改。
   VC下应该默认是8字节。  
测试,以下结构的大小是? 
struct com { 
    char c1;  1字节    由下面的对齐知道 占用了 4 字节    
 long tt;  关于 4 字节对齐   占用了 4 字节   
  int c9;   关于 4 字节对齐   占用了 4 字节    
short c3; 关于 2 字节对齐   占用了 4 字节    
 double c4;  关于4字节对齐   占用了 8 字节 };  4 的倍数, 所以大小共 24 字节。

union 共用体,是一个共用体里面的成员共用一段内存空间,所以共用体的大小就是成员变量最大的那个的字节大小
union  com {  //这个例子中,最大的成员变量是double 8个字节,所以union的大小为8
    char c1;  1字节    由下面的对齐知道 占用了 4 字节    
 long tt;  关于 4 字节对齐   占用了 4 字节   
  int c9;   关于 4 字节对齐   占用了 4 字节    
short c3; 关于 2 字节对齐   占用了 4 字节    
 double c4;  关于4字节对齐   占用了 8 字节 };  8字节。

-----------------------------------------------------------------------------------------------
vc++ 8字节对齐环境下
 struct inner
{
  char c1;
  double d;
  char c2;
};
这个结构体是8字节对齐,编译器知道是8字节对齐所以给c1分配8个字节,到了d依然是8个字节,到了c2也是8个字节,因此结构体 inner 占24个字节 。而 不是16个字节
但是:struct inner2
     {
        char c1;
        char c2;
        double d;
     }
这个结构体所占的空间却是16个字节。只是因为double d;这条语句的位置变了
  编译器在分配内存时依然是8字节对齐方式,给c1首先分8 个字节,到了c2一看他可以接在c1后边,所以c1和c2共同占有8字节,然后再给d分配8字节。所以最终 inner2  将 占16个字节

当结构体中包含结构体时,编译器依然将结构体拆开,找到占用内存最大的数据类型,以他所占的空间作为对齐标准,然后在以内部结构体所占的空间作为最小分配内存空间,在按照对齐原则分配内存。
比如:struct inner 
     {
       char c1;
       double d;
       char c2;
     };
     struct inner2
     {
       struct inner t1;
       int i;
       char c;
     };
   结构体inner2中还有结构体inner,这时首先找到inner中有double型数据,占用8字节所以,此时将是 8字节对齐 ,然后看struct inner t1; t1需要24字节 ,接下来 i需要4字节 c需要1字节 ,所以他们两个共分配8字节,加起来共32字节,正好对齐所以最终 inner2将占用32字节

---------------------------------------------------------------------------------------------------------------------------------------------

char [ ] ="hello"

实际占用了6个字节。h e l l o \0;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值