理解sizeof

其实理解 sizeof 只需要抓住一个要点:栈

程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针来间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。

char const * static_string = "Hello";

sizeof(static_string) 是 sizeof 一个指针,所以在 32bit system 4

char stack_string[] = "Hello";

sizeof(stack_string) 是 sizeof 一个数组,所以是 6 * sizeof(char)

char * string = new char[6];

strncpy(string,"Hello",6");

sizeof(string) 是 sizeof 一个指针,所以还是 4。和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。

不管指针指向的内容在什么地方,sizeof 得到的都是指针的栈大小

C++ 中对引用的处理比较特殊;sizeof 一个引用得到的结果是 sizeof 一个被引用的对象的大小。

另外,看到的关于sizeof的两个精巧的宏实现。

非数组的sizeof:

#defne _sizeof(T) ( (size_t)((T*)0 + 1) )

数组的sizeof:

#define array_sizeof(T)  ( (size_t)(&T+1)  - (size_t)(&T) )

原理就是c/c++中的指针运算。

原文:

http://blog.chinaunix.net/uid-20545494-id-1929750.html

posted @ 2012-11-17 13:59  浪里飞  阅读(486)  评论(0编辑  收藏  举报