#include<iostream>
#include<vector>
using namespace std;
class A
{
//virtual void func(){};
};
class B
{
int b;
};
class C
{
int c;
virtual void func(){};
};
int main()
{
cout<<sizeof(A)<<endl;//output 1
cout<<sizeof(B)<<endl;//output 4
cout<<sizeof(C)<<endl;//output 8
cout<<sizeof(int)<<endl;
A a1,a2,a3;
cout<<&a1<<" "<<&a2<<" "<<&a3<<endl;//0018FECF 0018FEC3 0018FEB7
B b1, b2, b3;
cout<<&b1<<" "<<&b2<<" "<<&b3<<endl;//0018FEA8 0018FE9C 0018FE90
C c1, c2, c3;
cout<<&c1<<" "<<&c2<<" "<<&c3<<endl;//0018FE80 0018FE70 0018FE60
return 0;
}
每个A和B的空间间隔是12,而每个C占据的空间是16.这是为什么?就算是有内存对齐,也没理由是12啊。
9 个解决方案
#1
是release吗
#2
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
#3
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
#4
很好奇为嘛我这边跟楼主现象不一样,64位机器,编译器VS2010
#5
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
不要debug
用release
#6
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
不要debug
用release
就是Release啊,真的~ 要不你也自己跑跑看结果、?
#8
楼主,我来回答你的问题吧。C/C++ 并不承诺连续申请的变量具有地址连续性。即A a1,a2,a3;这样的声明并不意味着它在内存的排列是连续的。
楼主你可以这么定义
struct s
{
A a1,a2,a3;
B b1, b2, b3;
C c1, c2, c3;
} abc;
用结构体的方式定义,这样他们的地址就是连续的
+ &abc.a1 0x0039fd30 A *
+ &abc.a2 0x0039fd31 A *
+ &abc.a3 0x0039fd32 A *
+ &abc.b1 0x0039fd34 {b=-858993460 } B *
+ &abc.b2 0x0039fd38 {b=-858993460 } B *
+ &abc.b3 0x0039fd3c {b=-858993460 } B *
+ &abc.c1 0x0039fd40 {c=-858993460 } C *
+ &abc.c2 0x0039fd48 {c=-858993460 } C *
+ &abc.c3 0x0039fd50 {c=-858993460 } C *
至于为什么之前的地址间隔如此有规律,那是由对应的编译器决定的,并不能保证在其他平台上也得到相同的结果。
楼主你可以这么定义
struct s
{
A a1,a2,a3;
B b1, b2, b3;
C c1, c2, c3;
} abc;
用结构体的方式定义,这样他们的地址就是连续的
+ &abc.a1 0x0039fd30 A *
+ &abc.a2 0x0039fd31 A *
+ &abc.a3 0x0039fd32 A *
+ &abc.b1 0x0039fd34 {b=-858993460 } B *
+ &abc.b2 0x0039fd38 {b=-858993460 } B *
+ &abc.b3 0x0039fd3c {b=-858993460 } B *
+ &abc.c1 0x0039fd40 {c=-858993460 } C *
+ &abc.c2 0x0039fd48 {c=-858993460 } C *
+ &abc.c3 0x0039fd50 {c=-858993460 } C *
至于为什么之前的地址间隔如此有规律,那是由对应的编译器决定的,并不能保证在其他平台上也得到相同的结果。
#9
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
不要debug
用release
果真如此,还成release调试模式就OK了。。。
#1
是release吗
#2
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
#3
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
#4
很好奇为嘛我这边跟楼主现象不一样,64位机器,编译器VS2010
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
#5
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
不要debug
用release
#6
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
不要debug
用release
就是Release啊,真的~ 要不你也自己跑跑看结果、?
#7
#8
楼主,我来回答你的问题吧。C/C++ 并不承诺连续申请的变量具有地址连续性。即A a1,a2,a3;这样的声明并不意味着它在内存的排列是连续的。
楼主你可以这么定义
struct s
{
A a1,a2,a3;
B b1, b2, b3;
C c1, c2, c3;
} abc;
用结构体的方式定义,这样他们的地址就是连续的
+ &abc.a1 0x0039fd30 A *
+ &abc.a2 0x0039fd31 A *
+ &abc.a3 0x0039fd32 A *
+ &abc.b1 0x0039fd34 {b=-858993460 } B *
+ &abc.b2 0x0039fd38 {b=-858993460 } B *
+ &abc.b3 0x0039fd3c {b=-858993460 } B *
+ &abc.c1 0x0039fd40 {c=-858993460 } C *
+ &abc.c2 0x0039fd48 {c=-858993460 } C *
+ &abc.c3 0x0039fd50 {c=-858993460 } C *
至于为什么之前的地址间隔如此有规律,那是由对应的编译器决定的,并不能保证在其他平台上也得到相同的结果。
楼主你可以这么定义
struct s
{
A a1,a2,a3;
B b1, b2, b3;
C c1, c2, c3;
} abc;
用结构体的方式定义,这样他们的地址就是连续的
+ &abc.a1 0x0039fd30 A *
+ &abc.a2 0x0039fd31 A *
+ &abc.a3 0x0039fd32 A *
+ &abc.b1 0x0039fd34 {b=-858993460 } B *
+ &abc.b2 0x0039fd38 {b=-858993460 } B *
+ &abc.b3 0x0039fd3c {b=-858993460 } B *
+ &abc.c1 0x0039fd40 {c=-858993460 } C *
+ &abc.c2 0x0039fd48 {c=-858993460 } C *
+ &abc.c3 0x0039fd50 {c=-858993460 } C *
至于为什么之前的地址间隔如此有规律,那是由对应的编译器决定的,并不能保证在其他平台上也得到相同的结果。
#9
类有虚函数时就有虚表,多出来的4个字节应该是那个虚表指针的大小。可以调试跟着看一下,C类对象应该有个vtpt啥的指针。
vptr只在C类里面有啊,所以sizeof(C)大小为8,但是建立C对象后,为什么每个C对象地址间隔变16了呢,VS插入了其他的东西吗?
不要debug
用release
果真如此,还成release调试模式就OK了。。。