虚指针按最大字节对齐?

xiaoguangzaia 2011-08-08 05:44:03
我是在vc和vs2008里面测试的。代码如下:

#include<iostream>

using namespace std;

typedef void(*Fun)(void);

class A
{
public:
A():aa('a'),ab(3.0)
{

}
virtual void AA()
{
cout<<"A"<<endl;
}
char aa;
double ab;
};

int main()
{
A b;

cout << sizeof(A) << endl; //大小为24

Fun pFun = NULL;

pFun = (Fun)*((int*)*(int*)(&b));
pFun(); //正确调用虚函数输出“A”

cout << char(*((char*)(&b)+8))<< endl; //正确输出aa的值'a'
cout << double(*((double*)(&b)+2))<< endl; //正确输出ab的值'3'

return 0;
}

这样测试也就是说明vc/vs中是将虚指针放在类的最开始的。而且虚指针后面有4字节的空间才到aa变量
4(虚指针)+ 4(对齐?)+ 1(aa)+7(对齐)+8(ab)= 24
但是按照一般的理解内存布局不应该是
4(虚指针)+1(aa)+3(对齐)+8(ab)= 16
我又测试了各种排列方式,但是不管怎么排列,输出大小总是24
不知道是不是vc/vs编译器中规定了虚指针大小和类中最大元素一至(如果该元素大于4)
如果是这样有什么用处呢?
...全文
158 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-08-08
  • 打赏
  • 举报
回复
指针大小,32位4字节,64位8字节。
至于输出24,和编译器有关吧
机智的呆呆 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 taodm 的回复:]
和编译器相关的东西,和编译选项关系也极大的东西。
最好不要认为有啥规则,不写依赖此结果的代码。
[/Quote]
支持,这个问题除了做逆向分析有意义,其他情况意义真不大。
taodm 2011-08-08
  • 打赏
  • 举报
回复
和编译器相关的东西,和编译选项关系也极大的东西。
最好不要认为有啥规则,不写依赖此结果的代码。
xiaoguangzaia 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nightkids_008 的回复:]

玄机逸士 分析过这个问题,具体哪个贴我记不清了。但是内容我记得:微软是把虚表指针和成员数据分开存放的,所以对齐会以最大的数据那个对齐。。。
[/Quote]
看来是这样的了
xiaoguangzaia 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 teatimel 的回复:]

看看你的编译器
结构体对齐方式是不是改了.
[/Quote]
我把double改成其它类型也测过,都没问题了
nightkids_008 2011-08-08
  • 打赏
  • 举报
回复
玄机逸士 分析过这个问题,具体哪个贴我记不清了。但是内容我记得:微软是把虚表指针和成员数据分开存放的,所以对齐会以最大的数据那个对齐。。。
至善者善之敌 2011-08-08
  • 打赏
  • 举报
回复
看来是和编译器有关了~~
品茶 2011-08-08
  • 打赏
  • 举报
回复
看看你的编译器
结构体对齐方式是不是改了.
帅得不敢出门 2011-08-08
  • 打赏
  • 举报
回复
gcc

cout << sizeof(A) << endl; //大小为16

Fun pFun = NULL;

pFun = (Fun)*((int*)*(int*)(&b));
pFun(); //正确调用虚函数输出“A”

cout << char(*((char*)(&b)+4))<< endl; //正确输出aa的值'a'
cout << double(*((double*)(&b)+1))<< endl; //正确输出ab的值'3'

64,282

社区成员

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

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