string 大小问题sizeof()

古道石阶 2012-06-13 10:38:31
为什么用sizeof(str),str为一个string 对象。结果都为32.不管这个string有多长。但他的size,capacity,会有变化,是否string对象的内部封装成一个占32个字节的类对象。而对象里面有指向实际存放字符位置的指针和一些于该字符串相关的参数,比如size,capacity,max_size等。
如果是这样那么声明string数组的时候例如string abc={“hi你好”,“hello”,“byebye”};
可以用sizeof(abc)/sizeof(string)求出数组的长度。
...全文
287 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2012-06-14
  • 打赏
  • 举报
回复
就像你自己写的类一样,你获得的是类中各成员变量的总大小,而你可以在类的构造函数或其他成员函数动态分配内存。
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
我在vs2008上实验了一下,(char*)&str。得到的不是字符char*。而(char*)&str[0]可以得到字符地址,且可以赋值。
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
好的,谢谢帮助,收益匪浅
jackyjkchen 2012-06-13
  • 打赏
  • 举报
回复
无法解释,从语义角度来说(char*)&str肯定是个char*型的类型了,但具体是不是谁知道

想看string的内存布局,直接看源码,或者看c_str()的地址和对象地址是不是一样更好
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
我知道str的成员函数getbuffer可以得到char* 以前也一直是这么用的。但只是想弄明白string的实现。大侠误会了,还是非常感谢您的帮助!!谢谢!!
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
我只是想弄明白底部是怎么实现的,不会这么做,谢谢大侠了
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
这是否说明如果char *a=(char*)str;可以实现赋值的话,那么这种实现的string的第一项一定是char *呢?
jackyjkchen 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
在弱问一下,如果char*是类的第一项,那是否要通过char*a=(char*)*(&str)的到,是这样吗?好像这样就相当于char *a=(char*)str; 对吗?
[/Quote]

不告诉你,因为绝对不希望你这样做,C++能做的事情太多了

所以C++有大量的禁止事项!
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
在弱问一下,如果char*是类的第一项,那是否要通过char*a=(char*)*(&str)的到,是这样吗?好像这样就相当于char *a=(char*)str; 对吗?
jackyjkchen 2012-06-13
  • 打赏
  • 举报
回复
sizeof(abc)/sizeof(string)的用法没有问题

string对象的地址就是对象的地址,有些实现同时又是字符串的首地址(char*是类的第一项即可)

但无人保证一定是这样

给你个原则就是C++的对象是个整体,任何对C++对象的错做都不要依赖内存布局,即便这个类是你自己写的
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
那是不是在那种实现下这个都可以使用呢?还有如果获得一个string的地址,这个地址又是之那个地址,是string对象的首地址,还是他保存字符的首地址,能否通过这个地址访问到字符
jackyjkchen 2012-06-13
  • 打赏
  • 举报
回复
你的代码sizeof(abc)/sizeof(string)可以保证是一定是3,这个没问题
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
因为上面的string数组声明和下面的string 用的应该是一种实现啊
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
对于上面的代码sizeof(abc)/sizeof(string)是否一定是数组的长度呢?
jackyjkchen 2012-06-13
  • 打赏
  • 举报
回复
VC和gcc的string

VC6和VS2010的string

VS2010和VS2010 SP1的string

都算不同实现

没有任何人给你保证他们的string的sizeof是多少,变了的话也是编译器厂商的自由,不违反任何标准
古道石阶 2012-06-13
  • 打赏
  • 举报
回复
1楼说的不同实现的string 之什么?
jackyjkchen 2012-06-13
  • 打赏
  • 举报
回复
string为了能够自动延长,为了能如破栈的大小限制,内部肯定是堆内存分配,sizeof去不到真正的大小

而且,不同的实现string的sizeof根本就不一样

64,648

社区成员

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

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