sizeof(string)的问题(很经典)
来源:互联网 发布:淘宝网厨房用品定时器 编辑:程序博客网 时间:2024/06/01 10:38
今天看到一个代码,刚开始没有看明白,代码如下:
<span style="font-size:14px;">#include<iostream>#include<string>using namespace std;void main(){string a="www.ok2002.com";string b=" study C++ program";a.append(b,0,sizeof(b)+2);cout<<a<<" "<<sizeof(b)<<endl;}</span>结果显示:sizeof(b)=16
当string=“C++"时,sizeof(b)=16
所以最好这样写:
a.append(b,0,b.size());
原因分析:
关于sizeof(string),那本面试宝典书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。
sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()为12、32字节的库实现。 但是VC6.0测试后sizeof(string)=16.还是跟编译器有关
bool数据类型与int类型一样,占用内存的字节数都是与编译系统相关的,它在不同的编译系统占用的字节数有所不同,在VC++6.0中,它占用的字节数是1个字节
sizeof bool=1;
什么是sizeof
首先看一下sizeof在msdn上的定义:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的吗?sizeof可以,所以sizeof不是函数。网上有人说sizeof是一元操作符,但是我并不这么认为,因为sizeof更像一个特殊的宏,它是在编译阶段求值的。举个例子:
cout<<sizeof(int)<<endl; // 32位机上int长度为4
cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl;
在编译阶段已经被翻译为:
cout<<4<<endl;
cout<<1<<endl;
这里有个陷阱,看下面的程序:
int a = 0;
cout<<sizeof(a=3)<<endl;
cout<<a<<endl;
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范围内,也就是()里面的内容也不能被编译,而是被替换成类型。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
int a = 0;
cout<<4<<endl;
cout<<a<<endl;
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。
结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。
- sizeof(string)的问题(很经典)
- sizeof(string)的问题(很经典)
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的问题
- sizeof和sizeof(string)的区别及问题
- JAVA String对象的经典问题(new String())
- 关于String的经典问题
- 南阳35表达式求值(栈)
- debian下安装mysql
- 仿腾讯盖楼爬墙新闻评论的CSS实现
- PHP检测及判断手机登录用户是安卓或爱疯(iPhone)客户端
- (python)热门话题的某些微博评论和转发数的抓取
- sizeof(string)的问题(很经典)
- 一张图简单揭秘linux链表精华container_of()的实现
- 【leetcode】7—reverse integer
- 自述
- PostgreSQL(数据库)资料和分布式系统(Distributed System)资料与Go语言资料整理
- Matlab归一化
- 更新SDK和ADT后提示"This Android SDK requires Android Developer Toolkit version 23.x.x or above"
- Mac添加新建文本文档
- Swap Nodes in Pairs(递归和非递归)