C++对象内存分配问题

zhengjiyue 2011-04-18 12:27:56
#include <iostream>
using namespace std;
class a
{
public:
char aa;
};
class b:public virtual a
{
public:
char bb;
};
class c:public virtual a
{
public:

};
class d:public b,public c
{
public:
};
int main()
{
a a1;
b b1;
c c1;
d d1;
cout<<sizeof(a1)<<" "<<sizeof(b1)<<endl;
cout<<sizeof(c1)<<endl;
cout<<sizeof(d1)<<endl;

}

为什么b1占9个字节,不是有字节对齐吗?
...全文
224 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengjiyue 2011-04-18
  • 打赏
  • 举报
回复
是不是因为他后面没有元素了 所以就不不齐了
我把class a改成
class a
{
public:
char aa;
int bb;
};
a所占字节就是8 原先是1
hzhxxx 2011-04-18
  • 打赏
  • 举报
回复


对齐的方式依赖于 编译器
we_sky2008 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhengjiyue 的回复:]
引用 5 楼 wulibin136 的回复:

不是后面没有了就不对齐了的,下面这个类
class A
{
int a;
char b;
};
它的大小也是8,会对齐的
这个和虚继承有点关系,编译器不把指向虚基类的指针算在对齐范围内


那么怎么样才会进行对齐呢?
我对于对齐的理解就是把需要访问的元素放在4的倍数的地址上(4字节对齐)。
对于你说的情况,为什么会是8呢?……
[/Quote]
编译器的问题,换个编译器试试,
我用的DEV C++,结果是对齐了的
zhengjiyue 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wulibin136 的回复:]

不是后面没有了就不对齐了的,下面这个类
class A
{
int a;
char b;
};
它的大小也是8,会对齐的
这个和虚继承有点关系,编译器不把指向虚基类的指针算在对齐范围内
[/Quote]

那么怎么样才会进行对齐呢?
我对于对齐的理解就是把需要访问的元素放在4的倍数的地址上(4字节对齐)。
对于你说的情况,为什么会是8呢?
luciferisnotsatan 2011-04-18
  • 打赏
  • 举报
回复
可能是虚继承的原因吧
淡蓝 2011-04-18
  • 打赏
  • 举报
回复
不是后面没有了就不对齐了的,下面这个类
class A
{
int a;
char b;
};
它的大小也是8,会对齐的
这个和虚继承有点关系,编译器不把指向虚基类的指针算在对齐范围内
we_sky2008 2011-04-18
  • 打赏
  • 举报
回复

DEV下面是有对齐的,
各个编译器实现虚拟继承的方式差别会很大,
下面是楼主所举例子在DEV下面的模型布局:

a:
____

aa //1 byte
____

a的大小为1 byte


b:
____

vbptr //4 byte
____

bb //1 byte
____

aa //1 byte
____

对齐之后大小为8 bytes



c:
____

vbptr //4 byte
____

aa //1 byte
____

对齐之后大小为8 bytes



d:
____

vbptr //4 byte
____

bb //1 byte
____

vbptr //4 byte
____

aa //1 byte
____

对齐之后大小为16 bytes
berkowitz 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhengjiyue 的回复:]
是不是因为他后面没有元素了 所以就不不齐了
我把class a改成
class a
{
public:
char aa;
int bb;
};
a所占字节就是8 原先是1
[/Quote]

没错,如果后面还有元素,则会对齐,否则不会

b对象的内存使用情况是这样的
1、头4个字节存放虚函数表入口地址
2、接下来4个字节存放的是char bb的数据,注意,尽管bb只需要1个字节,但是后面还需要把继承来的char a的数据保存下来,所以bb进行了对齐,占用了4个字节,不相信你可以把char bb改成int bb试试,肯定大小是没有改变的
3、最后一个字节存放了a的数据

所以总大小为4+4+1=9
内容概要:本文围绕基于元模型优化算法的主从博弈多虚拟电厂动态定价与能量管理展开研究,提出了一种结合主从博弈框架与元模型优化算法的协同优化方法。通过构建多虚拟电厂之间的主从博弈模型,刻画其在电力市场中的交互行为与利益分配机制,并引入元模型(如代理模型、响应面模型)对复杂优化问题进行近似求解,显著提升了计算效率与求解精度。该方法能够有效处理含不确定性因素的动态定价、负荷调度与能量管理问题,在保障系统运行稳定性的基础上,实现经济性与可靠性的协同优化。研究还提供了完整的Matlab代码实现路径与仿真结果,验证了所提方法在多主体协同决策与资源优化配置方面的有效性与实用性。; 适合人群:具备一定电力系统、博弈论基础及Matlab编程能力,从事能源互联网、综合能源系统、电力市场机制设计等相关领域研究的科研人员与研究生。; 使用场景及目标:①用于多虚拟电厂参与电力市场的动态定价机制设计与博弈行为建模;②实现考虑可再生能源不确定性的分布式能源系统协同优化调度;③为多主体能源系统的市场出清、收益分配与策略性投标提供算法支撑与仿真平台。; 阅读建议:建议读者结合所提供的Matlab代码深入理解主从博弈的数学建模过程与元模型优化算法的具体实现细节,重点关注目标函数构造、约束处理及算法收敛性分析,并可进一步拓展至其他智能优化算法或多场景鲁棒性对比研究,以深化对复杂能源系统决策机制的理解。
内容概要:本文详细介绍了用于无速度传感器交流电机驱动的扩展卡尔曼滤波器(EKF)的Matlab代码实现与Simulink仿真实现方法。该技术通过EKF算法对交流电机的转速和转子位置进行精确估计,克服了传统依赖速度传感器带来的成本高、易故障等问题,适用于高性能、高可靠性的电机控制系统。文中系统阐述了交流电机的非线性数学建模过程,构建了相应的状态空间方程与观测方程,明确了过程噪声与测量噪声的协方差矩阵设定方法,并深入探讨了滤波器初始参数的选择与整定策略。通过Simulink搭建完整的闭环控制系统仿真模型,验证了EKF在动态响应、抗干扰能力和稳态精度方面的优异性能,证明了其在无传感器矢量控制中的有效性和鲁棒性。该研究为现代电机驱动系统的低成本、高集成度设计提供了重要的理论依据和技术支持。; 适合人群:具备一定电机控制理论基础和Matlab/Simulink仿真能力的电气工程、自动化、控制科学与工程等相关专业的高年级本科生、研究生、科研人员及从事电机驱动系统开发的工程技术人员。; 使用场景及目标:①应用于无速度传感器的感应电机或永磁同步电机控制系统的设计与性能优化;②作为高等院校“现代控制理论”、“电机控制”、“电力电子与电力传动”等课程的教学案例或课程设计、毕业设计的技术参考;③帮助研究人员深入理解EKF在非线性系统状态估计中的应用机理,掌握其在工程实践中建模、仿真与参数调试的核心方法,进而提升复杂机电系统智能控制的研发能力。; 阅读建议:建议读者结合提供的Matlab代码与Simulink模型进行同步学习与仿真操作,重点关注EKF算法模块的实现细节、系统状态变量的选取逻辑以及噪声参数对滤波效果的影响。在学习过程中,应尝试改变电机负载、转速指令或引入测量噪声等不同工况,观察并分析EKF的估计性能变化,以深刻理解其动态响应特性和鲁棒性,从而真正掌握该先进状态估计算法的工程应用精髓。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧