sizeof操作得出奇怪结论

image_trans 2007-12-09 10:14:04
在学<<C++ Primer>>时,遇到一个sizeof的问题,希望高手能给我解答一下。
下面是程序:
#include <iostream>
#include <string>
#include <cstddef>
using namespace std;

int main()
{
int *pi = new int[12];

cout << "pi: " << sizeof(pi)
<<" *pi: " << sizeof(*pi)
<< endl;

string st1("foobar");
string st2("a mighty oak");

string *ps = &st1;

cout << "st1: " << sizeof(st1)
<<" st2: " << sizeof(st2)
<<" ps: " << sizeof(ps)
<<" *ps: "<<sizeof(*ps)
<< endl;

cout << "short: \t" << sizeof(short) << endl;
cout << "short*: \t" << sizeof(short*) << endl;
cout << "short&: \t" << sizeof(short&) << endl;
cout << "short[3]: \t" << sizeof(short[3]) << endl;
}

书上结果中有:
st1:12 st2:12 ps:4 *ps:12

为什么我用g++编译后得到的相应项的结果却是:
st1: 4 st2: 4 ps: 4 *ps: 4

难不成是作者搞错了,我想应该不太可能吧。还是不同的编译器会有不同的结论?
...全文
356 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
C334745710 2007-12-12
  • 打赏
  • 举报
回复
俺的VS2005怎么sizeof(string)是28呢!!!!!!!
上面的兄弟的VC怎么还有16的呢?
luojingpo 2007-12-12
  • 打赏
  • 举报
回复
楼主string是一个类,你想求出string类型的字符串的话,你就声明一个int len=str1.size();
你看看这样行不行!
jameshooo 2007-12-11
  • 打赏
  • 举报
回复
像string、CString这类封装了内存管理器的字符串类(准确地说应该是字符数组类)都有自己的默认分配大小,并不是按照实际字符个数来分配内存的,而是按照一定的设定值来执行内存增长,主要原因是为了性能,就像文件在硬盘上是按照256字节(或其它)作为一个单元来存储一样。在使用字符串封装类时,使用sizeof是没有实际意义的,一般都用类本身提供的函数(比如length()、GetSize()之类)来获取字符串长度。

具体的值不同完全取决于在不同平台上的实现。
hai040 2007-12-11
  • 打赏
  • 举报
回复
4个字节应该可以实现,就放一个指针,不过我记得gun的实现string和其它容器一样都是12的
iambic 2007-12-11
  • 打赏
  • 举报
回复
我是说“依赖”库的实现,而不是说所用的库的具体实现……
image_trans 2007-12-11
  • 打赏
  • 举报
回复
iambic,书上并没有讲到这个库的实现。

我猜<<STL源码剖析>>这本书里可能会讲到,但我没看过那本书。
ghostgorst 2007-12-11
  • 打赏
  • 举报
回复
类的对象大小为类的非静态成员占的空间,继承而来的非静态成员占的空间,虚函数表指针占的空间(如果有虚函数),以及它们之间内存对齐额外补的内存空间的总和.
所以要知道标准string的占的内存大小,要知道编译器的内存对齐方式,和各种类型占的内存大小.
maxx 2007-12-11
  • 打赏
  • 举报
回复
sizeof()是个奇怪的东西,它能接受所有表达式并且只关注表达式的返回结果:
比如:
int test(...);
sizeof(test());就回返回4,相当求int类型的大小
ocean放飞 2007-12-11
  • 打赏
  • 举报
回复
是啊,顶下
iambic 2007-12-10
  • 打赏
  • 举报
回复
书上没有讲这个依赖于库的实现吗?
jhs1982419 2007-12-10
  • 打赏
  • 举报
回复
int main()
{
int *pi = new int[12];
cout<<"pi:"<<sizeof(pi)<<"*pi:"<<sizeof(*pi)<<endl;
string st1("foobar");
string st2("a mighty oak");
string *ps = &st1;
cout<<"st1:"<<sizeof(st1)<<"st2:"<<sizeof(st2)//存放的还是 string 类型的长度
<<"ps:"<<sizeof(ps)<<"*ps:"<<sizeof(*ps)<<endl; //存放指针的长度,32位机是4个字节 cout<<"short:\t" <<sizeof(short)<<endl; //short 占两个字节
cout<<"short*:\t"<<sizeof(short*)<<endl; //指针占4个字节
cout<<"short&:\t"<<sizeof(short&)<<endl; //首地址,存放的仍然是short型,2字节
cout<<"short[3]:\t"<<sizeof(short[3])<<endl;//每个short型两字节,共6字节
}
image_trans 2007-12-10
  • 打赏
  • 举报
回复
kesaihao862,因为short是两个字节的,short的引用型即为两个字节。
image_trans 2007-12-09
  • 打赏
  • 举报
回复
谢谢ztz0223的回复,其实要求string对象的字符长度只要调用其成员函数size()就可以了,这一点我也知道。

我想再请问下各位,标准string对象的大小是多少?(VC6我知道对STL支持得不好,那g++呢? 为什么作者用的编译器结果与我编译出来的结果不同,还是作者的编译器对STL支持的也不好?)
就呆在云上 2007-12-09
  • 打赏
  • 举报
回复
string是一个类,不同的编译器的实现是不同的,毕竟现在的编译器都还很多没有达到c++标准
而对于一个指针,32位机器上都是4个字节,对一个string对象sizeof是不明智的,应该用strlen函数
image_trans 2007-12-09
  • 打赏
  • 举报
回复
楼上回得好快,谢谢了。

能否再说明下编译器为什么要这样设计string的长度?
kavinwell 2007-12-09
  • 打赏
  • 举报
回复
string是C++的一个类,sizeof(string)表示的并不是字符串的长度,而是类string的大小,不同的编译器实现不同,所以数值也有可能出现不同
kavinwell 2007-12-09
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
#include <cstddef>
using namespace std;

int main()
{
int *pi = new int[12];

cout << "pi: " << sizeof(pi)
<<" *pi: " << sizeof(*pi)
<< endl;

string st1("foobar");
string st2("a mighty oak");

string *ps = &st1;

cout << "st1: " << sizeof(st1) //string的长度,不同的编译器内部实现不同,VC++6.0=16
<<" st2: " << sizeof(st2) //同上
<<" ps: " << sizeof(ps) //指针,在32位机中占4个字节
<<" *ps: " <<sizeof(*ps) //同string长度,不同编译器不同
<< endl;

cout << "short: \t" << sizeof(short) << endl;
cout << "short*: \t" << sizeof(short*) << endl;
cout << "short&: \t" << sizeof(short&) << endl;
cout << "short[3]: \t" << sizeof(short[3]) << endl;
}
image_trans 2007-12-09
  • 打赏
  • 举报
回复
不会吧楼上的,我没用VC编译还不知道会出现这样的结果呢!-_-

那是怎么回事呢?期待解答。。。
yydrewdrew 2007-12-09
  • 打赏
  • 举报
回复
VC:
16 16 4 16
kesaihao862 2007-12-09
  • 打赏
  • 举报
回复
cout   <<   "short:   \t"   <<   sizeof(short)   <<   endl; 
cout << "short*: \t" << sizeof(short*) << endl;
cout << "short&: \t" << sizeof(short&) << endl;
cout << "short[3]: \t" << sizeof(short[3]) << endl;



cout   <<   "short&:   \t"   <<   sizeof(short&)   <<   endl;
为什么是2个字节呢?

65,211

社区成员

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

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