文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在C++中计算结构体与对象的大小

2023-06-15 00:20

关注

今天就跟大家聊聊有关怎么在C++中计算结构体与对象的大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

C语言是什么

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储器。

如何计算结构体的大小

其实计算一个结构的大小的方法并不难,简单来说就是把结构体内的所有成员的大小相加就可以。但是,需要内存对齐那么究竟什么是内存对齐,又为什么要进行类型对齐呢?

结构体的内存对齐

结构体内存对齐主要有两个步骤:

结构体各成员对齐.
2.结构体总体对齐

结构体内存对齐规则:

结构体的第一个成员在存放在结构体偏移量为0的位置
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。.

对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。

结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

说了这么多,我们直接在VS环境下举几个例子给大家说明一下:

例1:

struct S1{ char c1; int i; char c2;};

(1)计算这个结构体的大小的时候,首先看c1的大小是1(char类型),也即是说在结构体中c1存放的位置是结构体偏移量是0的位置

(2)接下来看i占4个字节,根据结构体对齐规则可知,c的有效对齐值为4(4 < 8)对齐到4的整数倍地址,即地址偏移量为4处.(40的位置存放了c1,所以只能从41的位置开始存放)

(3)同(2)得出c2的存储位置是8

(4)此时内存中共有9个字节,进行结构体整体对齐,最大对齐数是4,即要求是4的整数倍,也就是12

怎么在C++中计算结构体与对象的大小

例2:

struct S1{char c1;int i;char c2;};struct S2{char a1;struct S1 s1;int i;};

上面我们知道S1的大小是12,现在我们计算一下S2的大小:

(1)a1占一个字节,放在结构体变量偏移量为0 的地址处.

(2) s1占12个字节,对齐数位4(嵌套的结构体对齐到自己的最大对齐数的整数倍处,S1的最大对齐数是4),40处存放了a1,所以只能从41处开始存放

(3)i占了4字节,对齐数为4,s1一直存放到了15的位置,所以i只能从4*5 = 20的位置开始存储

(4)现在内存中共有20个字节,成员中最大对齐数是4,整体对齐时为4的倍数,所以结果是20

怎么在C++中计算结构体与对象的大小

注意:默认对齐参数是可以用#pragma pack()设置的,例如下面的这个例子

#include <stdio.h>#include <Windows.h>#pragma pack(8)//设置默认对齐数为8struct S1{char c1;int i;char c2;};#pragma pack()//取消设置的默认对齐数,还原为默认#pragma pack(1)//设置默认对齐数为1struct S2{char c1;int i;char c2;};#pragma pack()//取消设置的默认对齐数,还原为默认int main(){//输出的结果是什么?printf("%d\n", sizeof(struct S1));printf("%d\n", sizeof(struct S2));system("pause");return 0;}

怎么在C++中计算结构体与对象的大小

为什么存在内存对齐

平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器
需要作两次内存访问;而对齐的内存访问仅需要一次访问

如何计算一个对象的大小

其实在C++中,结构体和类可以认为是相同的,只是默认的访问权限不同(struct默认是public,class默认是private ),从这方面来看的话,其实计算一个类/对象的大小的方法和计算结构体的大小的方法是一样的。
我们来验证一下:

#include <iostream>using namespace std;struct A{int a;char b;char c;};class B{int a;char b;char c;};int main(){cout << sizeof(A) << endl;cout << sizeof(B) << endl;system("pause");return 0;}

怎么在C++中计算结构体与对象的大小

可以看到,我们对结构体A和类B计算大小是一样的。

看完上述内容,你们对怎么在C++中计算结构体与对象的大小有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯