C++:sizeof() —— 变量、指针、数组、类、结构体、联合体(共用体)、枚举类型
2019-07-23 11:27
441 查看
1、变量大小(64位机)
[code]sizeof(bool) = 1 sizeof(char) = 1 sizeof(short) = 2 sizeof(int) = 4 sizeof(long) = 4 sizeof(long long) = 8 sizeof(float) = 4 sizeof(double) = 8
2、数组、指针大小
[code]char arr[10]; char str[] = "hello world"; char *p = "hello world"; sizeof(arr) = 10 sizeof(str) = 12 sizeof(p) = 4 // 指针变量的大小
3、类、结构体
字节对齐:(1)对齐最宽的成员;(2)类/结构体的大小是最宽成员宽度的整数倍。
[code]class A { char a; }; class B { char a; int b; }; class C { char a; int b; short c; }; class D { char a; int b; short c; char *p; }; class E { char a; int b; short c; char *p; // 指针占 4 个字节 double d; }; class F { char a; short b; short c; }; class G { char a[11]; // 2 字节对齐,后面补 1 个空位,占 12 个字节 short b; short c; }; sizeof(A) = 1 // 1字节对齐 sizeof(B) = 8 // 4字节对齐 sizeof(C) = 12 // 4字节对齐 sizeof(D) = 16 // 4字节对齐 sizeof(E) = 24 // 8字节对齐 sizeof(F) = 6 // 2字节对齐 sizeof(G) = 16 // 2字节对齐
4、联合体(共用体)
联合体的大小:最宽成员大小的整数倍。
特点:只能给一个成员赋值,所有成员共享一块内存。
[code]union A { char a; }; union B { char a; short b; }; union C { char a; short b; int c; }; union C { char a[10]; short b; int c; }; union D { char a[10]; // 最大 10,不是 4 的倍数,改 12 short b; int c = 10; }; sizeof(A) = 1 // 最宽成员大小 1 sizeof(B) = 2 // 最宽成员大小 2 sizeof(C) = 4 // 最宽成员大小 4 sizeof(D) = 12 // 最宽成员大小的整数倍 4*3,也是一种对齐 所有成员共享一块内存: cout << (int)(aa.a[0]) << endl; 10 cout << (int)(aa.a[1]) << endl; 0 cout << aa.b << endl; 10 cout << aa.c << endl; 10
5、枚举类型
枚举类型的大小:4个字节
特点:保存一个从0开始的序列。
对于成员,是枚举常量,值为序列号,不能再被赋值;
成员就像宏常量一样,可以用来给枚举变量赋值,也可以用来给其他对象赋值。局部变量会屏蔽枚举常量。
对于枚举变量/对象,其值只能赋值为其成员,不能直接赋值为 0, 1, 2, ...。不能用枚举变量引用其成员。
[code]union A { a }; union B { a, b, c, d, e, f }; sizeof(A) = 4 sizeof(B) = 4
6、位段结构体
位段结构体大小:最宽成员的大小的整数倍。
位域/位段:以位为单位来指定成员所占内存的长度,这种成员称为“位域”或“位段”。
特点:
(1)成员类型 —— long long、int、short、char(unsigned char)。有符号或者无符号类型。char 默认是无符号的。
(2)一个位域必须存储在同一个存储单元中,不能跨越两个存储单元。
(3)存储单元的大小是最宽成员的宽度。
(4)位域长度不能大于存储单元的长度,不能定义位域数组。
(5)通过使用空域,可以使下一个位域从下一个存储单元开始存放。
[code]struct A { int a:8; int b:2; int c:6; }; struct B { int a : 8; int b : 2; int : 0; // 空域,使下一个位域从下一个存储单元 (int) 开始存放 int d : 3; }; struct C { short a : 8; short b : 2; short : 0; short d : 3; }; struct D { short a : 8; short b : 2; short : 0; int d : 3; }; struct E { int a : 8; short b : 2; short : 0; short d : 3; }; sizeof(A) = 4 // 1 * int sizeof(B) = 8 // 2 * int sizeof(C) = 4 // 2 * short sizeof(D) = 8 // 2 * int sizeof(E) = 8 // 2 * int
相关文章推荐
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
- C++中变量和基本类型,标准库类型以及数组和指针的使用规则
- C++ 自定义数据类型:结构体,共用体,枚举
- C++的数组、结构体、指针三种复合类型知识点小总结
- 结构体,联合体,枚举.sprintf ,结构体变量和指针成员,->含义
- c/c++ 中的 sizeof 运算符和数组类型的变量与形参
- 详解C++中的指针结构体数组以及指向结构体变量的指针
- sizeof - 指针,数组,变量,结构体字节对齐-计算
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
- C++之 自定义数据类型 枚举、结构体、共用体
- 2017.08.13指针小结+自定义数据类型(结构体、共用体、枚举、typeof)理论
- C语言03_构造类型 数组, 结构体, 共用体, 枚举类型介绍
- 从零开始学C++之从C到C++(二):引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
- 计算结构体、数组、指针的sizeof
- c# 调用 c++ dll 参数为结构体数组指针
- C++数组类型基础及数组指针基础
- More Effective C++----(1)指针与引用的区别 & (2)尽量使用C++风格的类型转换 & (3)不要对数组使用多态
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
- c/c++ 字符数组、字符指针和字符串类型总结帖