跳转到内容

C++ 编程

来自维基教科书,开放的书籍,开放的世界

sizeof 关键字指的是一个在编译时工作的运算符,它报告传递给它的类型所占存储空间的大小(等效于该类型变量的大小)。该大小以字符大小的倍数返回,在许多个人电脑上为 1 字节(或 8 位)。字符中的位数存储在 <climits> 头文件中定义的 CHAR_BIT 常量中。这是运算符重载不允许的运算符之一。

//Examples of sizeof use
int int_size( sizeof( int ) );// Might give 1, 2, 4, 8 or other values.

// or

int answer( 42 );
int answer_size( sizeof( answer ) );// Same value as sizeof( int )
int answer_size( sizeof answer);    // Equivalent syntax

例如,以下代码使用 sizeof 来显示多个变量的大小

 
    struct EmployeeRecord {
      int ID;
      int age;
      double salary;
      EmployeeRecord* boss;
    };
 
    //...
 
    cout << "sizeof(int): " << sizeof(int) << endl
         << "sizeof(float): " << sizeof(float) << endl
         << "sizeof(double): " << sizeof(double) << endl
         << "sizeof(char): " << sizeof(char) << endl
         << "sizeof(EmployeeRecord): " << sizeof(EmployeeRecord) << endl;
 
    int i;
    float f;
    double d;
    char c;
    EmployeeRecord er;
 
    cout << "sizeof(i): " << sizeof(i) << endl
         << "sizeof(f): " << sizeof(f) << endl
         << "sizeof(d): " << sizeof(d) << endl
         << "sizeof(c): " << sizeof(c) << endl
         << "sizeof(er): " << sizeof(er) << endl;

在大多数机器上(考虑字符的大小),上面的代码显示以下输出

 
    sizeof(int): 4
    sizeof(float): 4
    sizeof(double): 8
    sizeof(char): 1
    sizeof(EmployeeRecord): 20
    sizeof(i): 4
    sizeof(f): 4
    sizeof(d): 8
    sizeof(c): 1
    sizeof(er): 20

同样重要的是要注意,各种类型变量的大小会根据您所处的系统而变化。查看数据类型页面了解更多信息。

语法上,sizeof 在获取类型大小的时候看起来像一个函数调用,但在获取变量类型大小的时候可以使用括号(例如 sizeof(int))。如果参数是变量或数组,则可以省略括号(例如 sizeof xsizeof myArray)。关于在后一种情况下是否应该使用省略括号的余地,风格指南有所不同。

考虑下面的例子

    #include <cstdio>

    short func( short x )
    {
      printf( "%d", x );
      return x;
    }

    int main()
    {
      printf( "%d", sizeof( sizeof( func(256) ) ) );
    }

由于 sizeof 在运行时不评估任何内容,因此 func() 函数永远不会被调用。所有需要的信息都是函数的返回类型,第一个 sizeof 将返回一个 short(函数的返回类型)的大小,值为 2(在 size_t 中,一个在包含文件 STDDEF.H 中定义的整数类型),第二个 sizeof 将返回 4(第一个 sizeof 返回的 size_t 的大小)。

sizeof 测量一个对象的大小,就简单的连续存储区域而言;对于包含指向其他存储区的指针的类型,间接存储区包含在 sizeof 返回的值中。C++ 编程新手常犯的一个错误是试图使用 sizeof 来确定一个字符串的长度;std::strlen或者std::string::length函数更适合于此任务。

sizeof 在最近几年也得到了新的应用,在模板元编程中,它可以将类型转换为数字,尽管方式比较原始,但通常非常有用,因为模板元编程环境通常使用类型进行大部分计算。

华夏公益教科书