c/c++中使用sizeof计算结构体struct和类class的长度(字节)
来源:互联网 发布:快鸟地图软件 编辑:程序博客网 时间:2024/04/28 14:04
前言
结构体求sizeof
在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体内最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在的长度大于处理器位数的,那么就以处理器的位数为对齐单位。结构体内类型相同的连续元素,将在练习的空间内,和数组一样。多说无益,直接看程序。
struct {short a1;short a2;short a3;} A;struct {short a1;long a2;} B;cout<<sizeof(A)<<endl;cout<<sizeof(B)<<endl;
大家猜测结果是什么呢?
很多人以为是:6和6
正确答案是:6和8
为什么呢?
结构体A中有三个short类型的变量,各自以2字节对齐,长度为6字节。6是最大长度2的整数倍。故sizeof(A)=6;
结构体B中,long 占用4个字节,short占用2个字节,共6个字节,但是6不是4的整数倍,于是需要补空自己,增到8字节,即sizeof(B)=8
对类求sizeof
关于类,我将以两个例子来说明
列1:
class Student{public :bool isGirl;int age;bool beautiful;};
cout<<sizeof(Student);
结果为:12
列2:
class Student{public :bool isGirl;int age;bool beautiful;};
cout<<sizeof(Student);
结果:8
为什么会出现这种情况呢?
解析:这跟内存中数据对齐有关系。
列1对齐方式
|---------bool----------------|---------------------|---------------------|----------------------------| 三个字节用空格填充
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|---------------------|---------------------|----------------------------| 三个字节用空格填充
故12个字节
列2对齐方式
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|----------bool-----------|---------------------|----------------------| 2个字节用空格填充
故8个字节
列3:
class Student{public :int age; static int schoolNum;};
cout<<sizeof(Student)<<endl;结果:4
解析:因为静态变量式存放在全局数据区的,而sizeof计算栈中分配的大小,所以sizeof(Student)=4
2 0
- c/c++中使用sizeof计算结构体struct和类class的长度(字节)
- c/c++中使用sizeof计算union/struct/class
- 【C++】计算struct结构体占用的长度
- sizeof(class)---类的字节长度
- C当中关于sizeof(struct)和sizeof(union)计算
- 关于C/C++中结构体(Struct)类型的sizeof结果的探讨
- Swift中结构体(Struct)和类(Class)的区别
- sizeof计算结构体联合的长度
- C语言——用sizeof求结构体所占字节长度
- C语言结构体字节运算struct
- C struct的字节对齐问题及sizeof的用法
- C/C++中结构体struct 的使用
- C/C++中结构体的字节对齐以及求sizeof()
- sizeof(struct var) 的长度如何计算
- sizeof(struct var) 的长度如何计算
- c语言中sizeof struct和sizeof union
- C中结构体struct的用法
- [转]关于C中struct和union长度的详解
- vim命令笔记
- ueditor div style被过滤 解决办法
- android之Widget开发详解
- 深入理解java
- c10k问题
- c/c++中使用sizeof计算结构体struct和类class的长度(字节)
- android:windowSoftInputMode属性
- linux命令集散中心
- C++第2次实验
- tomcat各目录(文件)作用
- 青云QingCloud RDS 服务率先支持 MySQL 5.7
- 混合高斯模型(Mixtures of Gaussians)和EM算法
- C++作业2
- iOS从入门到颈椎病发作