设为首页 加入收藏

TOP

9.3.1 排列方式和补全(padding )
2013-10-07 15:03:31 来源: 作者: 【 】 浏览:78
Tags:9.3.1 排列 方式 padding

9.3.1  排列方式和补全(padding )

C++(www.cppentry.com)中,许多类型都有排列方式限制,考虑下面的代码:

  1. char x[sizeof(int)];  
  2.     int* p=(int*)x;  
  3.     *p = 0;  

如果数组x并不能得到int类型的内存空间大小,那么第3条语句(*p = 0)可能会导致不确定的行为(程序可能会中止 )。

为了可以得到最大的可移植性,代码就不应该依赖于对象内部的布局,因为语言定义根本就没有保证这种布局不会发生改变。例如,下面的代码

  1. int i;  
  2.     char* p = (char*)&i;  

并不能保证p肯定会指向i中的最低字节(或任何其他特定字节)。

现在考虑下面的代码:

  1. static union{  
  2.          int i;  
  3.          int bits:32;  
  4.    };  
  5.    bit ^= 1;  

即使我们知道上面的代码将会在int类型为32位的机器上运行,也不能保证赋值语句将会把i的最低位(或者任何其他特殊位)置位。

不仅如此,可移植代码还不能依赖于类对象的内部补全(padding)机制。例如,考虑下面代码:

  1. struct X {  
  2.          cnar c1;      
  3.          char c2;  
  4.     };  
  5.     int main() {  
  6.          X x;  
  7.          char* p = &x.c1;  
  8.          ++p;  
  9.          //...  
  10.     }  

我们并不能保证当p执行自增之后,它就会指向x.c2。

试图重叠不同的结构体也会导致许多可移植性问题。考虑下面的代码,它试图重叠结构体X和Y:

  1. struct X{  
  2.          char c1;  
  3.          char c2;  
  4.     };  
  5.     struct Y{  
  6.          int bits: 8;  
  7.          char c2;  
  8.     };  
  9.     int main() {  
  10.          X x;  
  11.          Y* y = (Y*)&x;  
  12.          y->c2 = 0;  
  13.          //...  
  14.     }  

即使我们知道这段代码将会在char类型为8位的机器上运行,我们也不能保证y->c2赋值语句可以清除x中c2域的值 。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.1 有编写可移植代码的必要吗 下一篇9.4.1 实现性定义的行为

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: