TheRiver | blog

You have reached the world's edge, none but devils play past here

0%

sizeof

参考

Why does sizeof(x++) not increment x?

C++ sizeof 使用规则及陷阱分析


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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

void Sum(int i[])
{
cout << i << endl; //0053F9A8
cout << sizeof(i) << endl; //4
}

int main()
{
int i[5] = { 0 };

Sum(i);
return 0;
}

  • 这里的i是存放地址的指针

OTHER

空类的大小是1

内存对齐的问题另外整理


ending

80111456_p0_master1200.jpg

----------- ending -----------