再出发

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sizeof整理来自 http://blog.csdn.net/w57w57w57/article/details/6626840

(0)sizeof是运算符,不是函数;

(1)sizeof不能求得void类型的长度;

(2)sizeof能求得void类型的指针的长度;

32位系统,sizeof(void*) 值为4,及32/8 = 4Byte。64位系统则为64/8 = 8Byte。

(3)sizeof能求得静态分配内存的数组的长度!

char a[] = "abcd";  //sizeof(a)值为5,字符串数组末尾有'\0'

char b[10] = "abcd"; //sizeof(b)值为10

int c[] = {1, 2, 3};   //sizeof(c)值为12,32位系统整型int的字节数为4Byte,因此4*3=12

int d[10] = {1, 2, 3}; //sizeof(d)值40

void test1(int a[10])
{
cout << sizeof(a) << endl;  // sizeof(a)值为4
}

(4)sizeof不能求得动态分配的内存的大小!

int* a = new int(10);  //sizeof(a)值为4

(5)sizeof不能对不完整的数组求长度;

char e[];
cout << sizeof(e) << endl; //编译出错,storage size of ‘e’ isn’t known

(6)当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!

int n = 3, m = 4;
char a = 'a';
cout << sizeof(n+m) << endl;  // 4
cout << sizeof(n = n+m) << endl;  // 4
cout << sizeof(a = n+m) << endl;  // 1
cout << sizeof(a+n) << endl;  // 4
cout << sizeof(n+a) << endl;  // 4
cout << a << endl;  // a
cout << n << endl;  // 3

sizeof返回的是表达式计算结果的类型大小,而不是表达式中占用最大内存的变量的类型大小!

尽量不要在sizeof中直接对表达式求大小,以免出现错误,你可以将sizeof(ch = ch+num);改写成 ch = ch +num;sizeof(ch);虽然多了一条语句,看似冗余了,其实好处多多。

(7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型的大小,但是不执行函数体!

int sum(int a, int b)
{
return a+b;
}

int n = 3, m = 4;
cout << sizeof(n = sum(n,m)) << endl; // 4
cout << n << endl;  // 3

(8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!

 首先说说内存中结构体字节对齐的问题 来自http://blog.csdn.net/haiwil/article/details/7070593

对齐的作用和原因:

各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据,显然在读取效率上下降很多。

字节对齐规则:

  1.数据类型自身的对齐值:对于char型的数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4个字节。
  2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
  3.指定对齐值:#pragma pack (value)时指定的对齐value。
  4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。

补充:

1).每个成员分别按自己的方式对齐,并能最小化长度。
2).复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
3).对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。

计算规则:

1)整体空间是 占用空间最大的成员(的类型)所占字节数的整倍数

2)数据对齐原则----内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。。。。。
注意:数组按照单个变量一个一个的摆放,而不是看成整体。如果成员中有自定义的类、结构体,也要注意数组问题。

sizeof计算结构体大小见 http://www.cnblogs.com/motadou/archive/2009/01/17/1558438.html

(9)sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小!

posted on 2014-03-26 15:03  小神你好  阅读(830)  评论(0编辑  收藏  举报