求助!!对string对象和vector对象执行sizeof运算结果
答案:2 悬赏:50 手机版
解决时间 2021-03-17 20:20
- 提问者网友:心如荒岛囚我终老
- 2021-03-17 10:12
”对string对象和vector对象执行sizeof只返回该类型固定部分的大小,不会计算对象中元素占用了多少空间“这句话中“只返回该类型固定部分的大小”这是什么意思?谁能给详细解释一下
最佳答案
- 五星知识达人网友:青尢
- 2021-03-17 11:48
一个类的成员变量可大致分为两种,固定分配成员和动态分配变量,例如这样一个类:
class AClass
{
int a,b,c;
int *p;
AClass()
{
p=new int [10];
}
~AClass()
{
delete[] p;
}
};直观上,它有四个成员:a,b,c,p,不过从用途上,他也可以分为三个固定分配成员a,b,c和一组动态分配成员p[10],它生成的对象实际占有的内存空间为13个int和一个int*的空间(即56 Byte)。然而,sizeof返回的则只是这个类“直观上”(也就是写在成员声明里的)的占用空间,也就是3个int和一个int*的空间(即16 Byte)。
string类和这个类很相像,它有一个动态分配的成员来存储字符串数据(因为字符串变长所以才要动态分配),而sizeof是检测不到这个内存长度的。vector同理
class AClass
{
int a,b,c;
int *p;
AClass()
{
p=new int [10];
}
~AClass()
{
delete[] p;
}
};直观上,它有四个成员:a,b,c,p,不过从用途上,他也可以分为三个固定分配成员a,b,c和一组动态分配成员p[10],它生成的对象实际占有的内存空间为13个int和一个int*的空间(即56 Byte)。然而,sizeof返回的则只是这个类“直观上”(也就是写在成员声明里的)的占用空间,也就是3个int和一个int*的空间(即16 Byte)。
string类和这个类很相像,它有一个动态分配的成员来存储字符串数据(因为字符串变长所以才要动态分配),而sizeof是检测不到这个内存长度的。vector同理
全部回答
- 1楼网友:北城痞子
- 2021-03-17 12:37
有虚函数的话就有虚表,虚表保存虚函数地址,一个地址占用的长度根据编译器不同有可能不同,vs里面是8个字节,在devc++里面是4个字节。类和结构体的对齐方式相同,有两条规则
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行
下面是我收集的关于内存对齐的一篇很好的文章:
在最近的项目中,我们涉及到了“内存对齐”技术。对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的 “管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。
一、内存对齐的原因
大部分的参考资料都是如是说的:
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
二、对齐规则
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯