重新开个帖子 继续那个内存对齐问题

guan323333 2010-10-25 09:54:56
饿,可能是那个帖子没说清楚,我再开个问吧

#include <iostream.h>
class A
{
float a;
double b;
char c;
virtual int f(){};


};
int main()
{
cout<<sizeof(A)<<endl; //结果是32
return 0;
}


另外一个
#include <iostream.h>
class A
{
float a;
double b;
char c;
int f;

};
int main()
{
cout<<sizeof(A)<<endl; //结果是24
return 0;
}



为什么呢..
...全文
104 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyuxiangtheone 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liyang467 的回复:]
我用vs2010 /Zp是默认(8对齐)

输出是32, 24

第一个
vfptr 占8字节 pppp0000
float a 占8字节 aaaa0000
double b 占8字节 bbbbbbbb
char c 占8字节 c0000000

第二个
没有vfptr
float a 占8字节 aaaa0000
double b 占8字节 bbbbbbbb
char……
[/Quote]
为什么2个CHAR的字节数不同?
gules 2010-10-27
  • 打赏
  • 举报
回复
楼主试试如下数据成员的情况是多少(不再设虚函数)?
int* ptr;
float a;
double b;
char c;
  • 打赏
  • 举报
回复
[Quote=引用楼主 guan323333 的回复:]
饿,可能是那个帖子没说清楚,我再开个问吧

C/C++ code

#include <iostream.h>
class A
{
float a;
double b;
char c;
virtual int f(){};


};
int main()
{
cout<<sizeof(A)<<endl; //结果是32
return 0……
[/Quote]

第一个是32 是因为char c,f()不能合并到一起 各占8字节第二个是24 是因为char c,int f合并共占8字节
FreddyHu 2010-10-27
  • 打赏
  • 举报
回复
注意 虚函数
hslinux 2010-10-26
  • 打赏
  • 举报
回复
#pragma pack(n)

...

#pragma pack()

不同编译器默认的对齐方式不一致,有需要的话直接自己控制对齐方式好了。
当n大于结构的最大成员的大小时,n取最大成员的大小。

PS:虚函数地址计算时与成员函数大小分开计算,也就是虚函数地址不会填充成员函数中不满n的位置。
qq120848369 2010-10-25
  • 打赏
  • 举报
回复
涉及到虚函数,和编译器有关了.
liyang467 2010-10-25
  • 打赏
  • 举报
回复
我用vs2010 /Zp是默认(8对齐)

输出是32, 24

第一个
vfptr 占8字节 pppp0000
float a 占8字节 aaaa0000
double b 占8字节 bbbbbbbb
char c 占8字节 c0000000

第二个
没有vfptr
float a 占8字节 aaaa0000
double b 占8字节 bbbbbbbb
char c 占4字节 c000
int f 占4字节 ffff
Orange_ou 2010-10-25
  • 打赏
  • 举报
回复
关键是那个虚表指针 为什么会被填充了4个字节
dingshaofengbinbin 2010-10-25
  • 打赏
  • 举报
回复
这个和编译器有关!!!
AlwaysSLH 2010-10-25
  • 打赏
  • 举报
回复
这个会和编译器的实现有关,vs2008 debug下第一个是32,调试时看了一下A的对象的内存分布:
A a;
&a 为 0x0012ff44
虚表指针首地址 为 0x0012ff44
&a.a 为 0x0012ff4c
&a.b 为 0x0012ff54
&a.c 为 0x0012ff5c

x64进程远程hook,x64_远程调用函数,源码更新V1.8.2:2021/4/12 源码为下方连接帖子后续更新内容: 浅谈64位进程远程hook技术: https://bbs.125.la/forum.php?mod=viewthreadtid=14666356extra= 不管您是转载还是使用请保留版权,源码在精益论坛免费发布本人未获利,请不要用于非法途径。 --------------------------------------------------------------- 2021/4/12 模块源码 v1.8.2更新 1:修复 x64_远调用函数()在 易语言 主线程调用时造成消息无法回调,导致易语言主线程窗口卡死的问题。      感谢楼下易友发现的BUG,已经第一时间更新 2021/4/12 模块源码 v1.8.1更新 1:修复 hook全部卸载时的流程写法的一个错误,由于句柄的提前关闭导致多个hook点卸载不干净的问题 2:改写了消息回调时线程传参的代码优化,优化了其他一些小问题 3:  鉴于很多朋友需要,改写了模块自带实列,对TCP,UDP的两组封包函数做了hook实列写法 4:列子中同样增加对x64_远调用函数()的应用写了几个列子,如使用套接字取得本地或远端IP端口API调用的的应用实列 5:本hook模块不支持非模块内存区hook,如申请的动态分配页等,不是不能支持,只是觉得没有任何意义,对这方面有需求的,自行改写模块源码使用 提醒:hook回调函数中尽量减少耗时代码,时间越长返回越慢,回调中谨慎操作控件,如必须要用到可参考源码中实列写法采用线程操作 历史更新 --------------------------------------------------------------- 2021/3/1   模块源码v1.6更新: 1:修复  x64_远程调用函数()命令,在没有提供 寄存器 参数时,没有返回值的BUG。 --------------------------------------------------------------- 2021/2/28 模块源码v1.5更新: 一:修复win7 64位系统下枚举模块 出现部分模块长度出现负数的问题,从而导致部分win7用户不能使用 二:强化 远程hook64指令_安装 的稳定性:        1,穿插代码中增加对标志位的保护,避免hook位置长度下一条指令为跳转时产生跳转错乱的问题,强化了hook任意位置的定位        2,因为穿插代码中会调用API函数,而64位汇编必须遵守栈指针16字节对齐,故对穿插代码进行栈指针16字节对齐,增强稳定性        3,hook指令安装支持长度由6-127字节 变动 为 6-119字节,原因么没必要说了,代码优化造成的,稍微少了一点无所谓了        4,对模块回调进行了适当优化处理,增强稳定性 三:应支持的朋友需要故增加 x64_远程调用函数()命令,易语言可以直接远call64进程,且无需写汇编代码或机器码指令,支持15个参数,支持返回值,支持16个通用寄存器全部取得返回值       该功能调用即16字节栈对齐,不要用户管堆栈,代码内部构成,远线程执行,你只需要知道call有几个参数,需要什么寄存器,对应提供即可。 四:有朋友说原模块x64英文看了烦,那好吧就给改成了中文标识,弄得我自己也不习惯 五:源码内列子改了改,可以自己看,需要注意的是模块注释的很详细,使用前最好看一看,尤其是hook回调接口的写法和安装的写法最好按照模块列子中的写法来,除非你能把64hook模块组看懂一遍,对于一些对本模块一知半解的朋友请不要乱改乱发,这个模块我会继续增强的,只是工作原因时间有限,只能一点一点来

64,653

社区成员

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

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