string的sizeof和构造函数

别逗我乐 2009-06-09 11:57:56
#include<iostream>
#include<cstring>
#include<string>
using std::cout;
using std::endl;
int main(int argc,char *argv[])
{
std::string a("123");
cout<<sizeof(a)<<endl;//notice:it is always 4
std::string b("456");
cout<<&a<<endl;//0x22ff68
cout<<&b<<endl;//0x22ff58 这两个地址之间的应该就是a的内容呀
return 0;
}

我的编译器是MinGw

1.
cout<<sizeof(a)<<endl;不随着string所包含字符串的大小变动。为什么呢?难道string对象存储,字符串是使用指针实现的?

2.
我不是很清楚,
std::string a("123");
std::string a = "123";的区别。
前者是调用string的构造函数,后者呢?
是先 转换构造函数,再拷贝构造函数?
还是两者等价。

3.
char *array1="1234";与char array2[]="1234";
前者应该是在堆上分配的,后者是栈上的。我想知道,是不是指针所指向的内容都是在栈上分配的?
另外C++ 的栈,地址是逐渐变大的,是小顶堆吧?

提问的问题有点多,先谢谢大家了。
...全文
160 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fg313071405 2009-06-26
  • 打赏
  • 举报
回复
char* = "1234" 这是放在readonly里面,只有字符指针是这样的
性能侠客行 2009-06-09
  • 打赏
  • 举报
回复
老问题了.
要分清楚,堆 ,栈 , 常量区 ,代码区
网上 找堆栈相关的信息看看了.
hongzao 2009-06-09
  • 打赏
  • 举报
回复
1.
cout < <sizeof(a) < <endl;不随着string所包含字符串的大小变动。为什么呢?难道string对象存储,字符串是使用指针实现的?

从这里可以看出你的库string确实是由包含一个char*. 但试想一下,变量的东西要不放在栈,就放在堆中,但string是可以动态添加和删除字符的,由此可想,能把真正的数据防在栈中吗?当然不行,可行的方法就是自身包含一个char*,然后让它指向堆空间.

2.
我不是很清楚,
std::string a("123");
std::string a = "123";的区别。
前者是调用string的构造函数,后者呢?
是先 转换构造函数,再拷贝构造函数?
还是两者等价。

在这里两者是相同的,除非你的编译器真的很简陋. 但如果是 std::string a; a = "123"; 那么就不同咯,这里先调用了一次默认构造函数,然后调用赋值函数.

3.
char *array1="1234";与char array2[]="1234";
前者应该是在堆上分配的,后者是栈上的。我想知道,是不是指针所指向的内容都是在栈上分配的?
另外C++ 的栈,地址是逐渐变大的,是小顶堆吧?

前者"1234"是放在常量区且它的实际值为"1234\0", 而后者放在栈区,且它的实际值为"1234".
指针可以指向任何一块有效的内存地址,不一定非要堆,就像前面的第一个就不是指向堆区的.
gleen 2009-06-09
  • 打赏
  • 举报
回复
顶一下
别逗我乐 2009-06-09
  • 打赏
  • 举报
回复
是关键是想问
cout < <&a < <endl;//0x22ff68
cout < <&b < <endl;//0x22ff58 这两个地址之间的应该就是a的内容呀
为什么,会这样呀?
另外,在堆上的分配如下:
int main(int argc,char *argv[])
{
std::string *p = new std::string("123");
std::string *q = new std::string("456");
cout<<static_cast<void *>(p)<<endl;//0x3e2470
cout<<static_cast<void *>(q)<<endl;//0x3e2758
return 0;
}

pengzhixi 2009-06-09
  • 打赏
  • 举报
回复
1.
cout < <sizeof(a) < <endl;不随着string所包含字符串的大小变动。为什么呢?难道string对象存储,字符串是使用指针实现的?
按你输出的结果你的string使用指针来实现的。

2.
我不是很清楚,
std::string a("123");
std::string a = "123";的区别。
前者是调用string的构造函数,后者呢?
是先 转换构造函数,再拷贝构造函数?
还是两者等价。
都是构造函数,因为有个string(const char*)这个非显示的构造函数,所以你上面两个没什么区别。
3.
char *array1="1234";与char array2[]="1234";
前者应该是在堆上分配的,后者是栈上的。我想知道,是不是指针所指向的内容都是在栈上分配的?
另外C++ 的栈,地址是逐渐变大的,是小顶堆吧?
前者的“1234”在常量区,array1指向这个常量字符串。而后者是在栈区。
goodname 2009-06-09
  • 打赏
  • 举报
回复
1
sizeof是指的a的这个类的大小,所有同类型的sizeof都是一样的
2
都是调用构造函数
3
前者应该是在全局变量区中,堆上一般是通过new,或者malloc分出来的。
应该说指针变量,这个变量是在栈上的。如果你在函数中使用的话。
pengzhixi 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 jsjrj01 的帖子:]
#include <iostream>
#include <cstring>
#include <string>
using std::cout;
using std::endl;
int main(int argc,char *argv[])
{
std::string a("123");
cout < <sizeof(a) < <endl;//notice:it is always 4 //你这是测试string这个类型的大小这个与string的具体实现有关如果你想测里面的字符数,你应该用a.size()
std::string b("456");
cout < <&a < <endl;//0x22ff68
cout < <&b < <endl;//0x22ff58 这两个地址之间的应该就是a的内容呀//很明显你把两个string对象的地址和里面的字符串的存放地址弄混了,这里是指两个对象的地址而不是字符串的地址
return 0;
}

我的编译器是MinGw

1.
cout < <sizeof(a…
[/Quote]
LZ好糊涂
yyyapple 2009-06-09
  • 打赏
  • 举报
回复
1. 类的内存布局在类定义好后已经明确了
2. 构造函数,再拷贝构造函数
3. 不是栈,是只读常量区
The_facE 2009-06-09
  • 打赏
  • 举报
回复
见鬼,图片被禁掉了,兄弟!
别逗我乐 2009-06-09
  • 打赏
  • 举报
回复
pengzhixi 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jsjrj01 的回复:]
有人能帮我分析一下string类的成员吗?
在debug下断点,watch,
[/Quote]
不同的编译器厂商可能实现不太一样,不过就你这个sizeof(string)的结果来看,string类里面应该是一个char *成员。
The_facE 2009-06-09
  • 打赏
  • 举报
回复
不过内存区域还是应该清楚,上面的都已经说的很多了。
The_facE 2009-06-09
  • 打赏
  • 举报
回复
string类的内部构造分析起来没有太大的意义。

其实归结起来都是使用char *来实现的。
别逗我乐 2009-06-09
  • 打赏
  • 举报
回复
有人能帮我分析一下string类的成员吗?
在debug下断点,watch,

64,637

社区成员

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

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