• C++
  • sizeof是 C 和 C++ 中的一个操作符

  • @ 2024-12-28 18:54:05
  1. 基本概念

    • sizeof是C和C++ 中的一个操作符,它用于获取数据类型或者变量所占用的字节数。字节数的大小取决于编译器和目标平台,例如在32位系统和64位系统中,一些数据类型的字节数可能会不同。
  2. 语法格式

    • sizeof(类型名)或者sizeof(变量名)
    • 例如:sizeof(int)可以获取int类型占用的字节数;sizeof(myVariable)可以获取变量myVariable占用的字节数。
  3. 用于基本数据类型

    • 整数类型
      • 在大多数32位系统中,sizeof(char)通常是1字节,因为char类型用于存储单个字符。sizeof(int)一般是4字节,int类型用于存储整数。sizeof(long)可能是4字节或者8字节,具体取决于编译器和系统。例如:
      #include <iostream>
      int main() {
          std::cout << "sizeof(char): " << sizeof(char) << " bytes" << std::endl;
          std::cout << "sizeof(int): " << sizeof(int) << " bytes" << std::endl;
          std::cout << "sizeof(long): " << sizeof(long) << " bytes" << std::endl;
          return 0;
      }
      
    • 浮点数类型
      • sizeof(float)在大多数系统中是4字节,用于存储单精度浮点数;sizeof(double)通常是8字节,用于存储双精度浮点数。例如:
      #include <iostream>
      int main() {
          std::cout << "sizeof(float): " << sizeof(float) << " bytes" << std::endl;
          std::cout << "sizeof(double): " << sizeof(double) << " bytes" << std::endl;
          return 0;
      }
      
    • 指针类型
      • 在32位系统中,指针类型(如int*char*等)通常占用4字节,因为32位地址空间可以用4字节来表示内存地址。在64位系统中,指针类型一般占用8字节,因为64位地址空间需要8字节来表示内存地址。例如:
      #include <iostream>
      int main() {
          int* ptr;
          std::cout << "sizeof(int*): " << sizeof(int*) << " bytes" << std::endl;
          char* charPtr;
          std::cout << "sizeof(char*): " << sizeof(char*) << " bytes" << std::endl;
          return 0;
      }
      
  4. 用于数组

    • sizeof用于数组时,它返回整个数组所占用的字节数。对于一维数组,计算公式是sizeof(数组名)=数组元素类型占用字节数×数组元素个数。例如:
    #include <iostream>
    int main() {
        int arr[] = {1, 2, 3, 4, 5};
        std::cout << "sizeof(arr): " << sizeof(arr) << " bytes" << std::endl;
        std::cout << "Number of elements in arr: " << sizeof(arr)/sizeof(arr[0]) << std::endl;
        return 0;
    }
    
    • 这里sizeof(arr)返回整个数组占用的字节数,sizeof(arr[0])返回数组中单个元素(这里是int类型)占用的字节数,通过sizeof(arr)/sizeof(arr[0])可以计算出数组元素的个数。
  5. 用于结构体和联合体

    • 结构体
      • 对于结构体,sizeof返回结构体对象所占用的总字节数。结构体的大小可能会受到对齐方式(alignment)的影响。例如:
      #include <iostream>
      struct MyStruct {
          int a;
          char b;
      };
      int main() {
          std::cout << "sizeof(MyStruct): " << sizeof(MyStruct) << " bytes" << std::endl;
          return 0;
      }
      
      • 这里MyStruct结构体包含一个int类型成员和一个char类型成员。由于内存对齐的原因,int类型通常会占用4字节且在内存中以4字节对齐,所以这个结构体的大小可能不是简单的sizeof(int)+sizeof(char),而是会根据编译器的对齐规则进行填充,实际大小可能大于这个和。
    • 联合体
      • 联合体(union)的sizeof返回联合体所占用的字节数,其大小取决于联合体中最大成员的大小。例如:
      #include <iostream>
      union MyUnion {
          int a;
          double b;
      };
      int main() {
          std::cout << "sizeof(MyUnion): " << sizeof(MyUnion) << " bytes" << std::endl;
          return 0;
      }
      
      • 这里MyUnion联合体包含一个int类型成员和一个double类型成员,因为double类型占用字节数较多(通常8字节),所以sizeof(MyUnion)返回的值是8字节。

0 条评论

目前还没有评论...