sizeof

  • sizeof运算符返回一条表达式或一个类型所占的字节数.sizeof运算符的结果是一个size_t类型的值.

  • sizeof运算符满足右结合律.因此,表达式sizeof p等价于sizeof(\p). 这是因为sizeof满足右结合律且与*运算符的优先级相同.所以表达式会按照从右向左的顺序组合.

  • sizoef运算符并不实际求其运算对象的值.因此,sizeof运算可以对一个无效指针进行运算.

    以下是各种内置数据类型在64位机器上所占空间大小:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    cout << "sizeof(int):" << sizeof(int) << endl;      // 4
    cout << "sizeof(float):" << sizeof(float) << endl; // 4
    cout << "sizeof(double):" << sizeof(double) << endl;// 8
    cout << "sizeof(char):" << sizeof(char) << endl; // 1

    int *p = 0;

    // 8, 指针本身所占内存空间的大小
    cout << "sizeof(p):" << sizeof(p) << endl;

    // 4, 指针指向的对象所占内存空间的大小
    cout << "sizeof(*p):" << sizeof(*p) << endl;

    p = new int{12};
    // 8, 指针本身所占内存空间的大小
    cout << "sizeof(p):" << sizeof(p) << endl;

    // 4, 指针指向的对象所占内存空间的大小
    cout << "sizeof(*p):" << sizeof(*p) << endl;
  • sizeof运算符与数组

    • 对数组执行sizeof运算得到整个数组所占空间的大小.sizeof运算不会把数组名转成指针来处理
    • 可以利用sizeof运算符来求数组中元素个数.
    1
    2
    3
    4
    5
    int arr[] = {1, 2, 3};
    cout << "sizeof(arr):" << sizeof(arr) << endl; // 12(4x3)

    int n = sizeof(arr) / sizeof(*arr);
    cout << "n=" << n << endl; // 3,数组中元素个数
  • 对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间

    1
    2
    3
    4
    vector<int> arr{1, 3, 7, 3};
    vector<int> brr(100, 0);
    cout << "sizeof(arr):" << sizeof(arr) << endl; // 24
    cout << "sizeof(brr):" << sizeof(brr) << endl; // 24