参考
Why does sizeof(x++) not increment x?
sizeof
The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
这段话有几个重要的点:
- sizeof是运算符,不是函数
- 如果操作数的类型是可变长度数组类型,则对操作数求值。否则不对操作数求值
基于以上两点,再细化下
cout << sizeof(5) << endl; // 4
cout << sizeof 5 << endl; // 4
上面两种方式都是正确的,但要注意,如果操作数是类型不是对象,则要加().
cout << sizeof(int) << endl; // 4
//cout << sizeof int << endl; //error
sizeof(i++)问题:
int i = 5;
cout << sizeof(i++) << endl; //4
cout << i << endl; //5
原因开头也讲了:如果操作数的类型是可变长度数组类型,则对操作数求值。否则不对操作数求值
.
陷阱
记录下这篇文章中提到的一些sizeof容易搞错的点,挑了一部分
001
int a = 0;
cout<<sizeof(a=3)<<endl; //4
cout<<a<<endl; //0
- 和上面的一样,不对操作数求值
002
int f1() { return 0; }
void f3() {}
cout << sizeof(f3()) << endl; //错误 C2070 “void”: 非法的 sizeof 操作数
cout << sizeof(f1) << endl; //错误 C2070 “int (void)”: 非法的 sizeof 操作数
- 不能求void的大小
- 不能求函数地址的大小(*f3或者f3()是正确的)
003
char a[] = "abcdef";
char b[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
int c[20] = { 3, 4 };
char d[2][3] = { "aa", "bb" };
cout << sizeof(a) << endl; // 7, 表示字符串
cout << sizeof(b) << endl; // 6, 仅表示字符数组
cout << sizeof(c) << endl; // 80
cout << sizeof(d) << endl; // 6 = 2*3
- 注意常量字符串的末尾的结束符
- 注意数组的大小是元素大小*元素个数
004
int *d = new int[10];
cout << sizeof(d) << endl; // 4
cout << d << endl; //014852D8
- d实际还是指针
005
double* (*a)[3][6];
cout << sizeof(a) << endl; // 4
cout << sizeof(*a) << endl; // 72
cout << sizeof(**a) << endl; // 24
cout << sizeof(***a) << endl; // 4
cout << sizeof(****a) << endl; // 8
- a是指针
- a是二维数组的数组名 72 = 36*4
- **a指向一维数组 24 = 6 * 4
- ***a指向一维数组的第一个元素(指针) 4
- ****a指向第一个指针指向的double类型的值 8
006
1 |
|
- 这里的i是存放地址的指针
OTHER
空类的大小是1
内存对齐的问题另外整理