C++ 学习杂谈:sizeof和sizeof(string)的问题
最近遇到一个令我困惑的问题,就是 sizeof(string)的值,之前在vs2010上测得是固定28,最近在用CLion,上面测得是4,出现了不一样的结果,我又在vs2013上试了一下,结果又不一样,在vs2013上是32.
查阅了相关资料得出结论:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。 sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()为28、32字节的库实现。 但是MS2015测试后sizeof(string)=40.还是跟编译器有关.
也就是说sizeof(string)和字符串的长度是无关的,在一个系统中所有的sizeof(string)是一个固定值,这个和编译器相关,string字符串是存储在堆上,这个属于动态分配的空间,对于别的整形浮点型数据类型则没有这个问题。
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长度为4cout<<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当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。
C++ 学习杂谈:sizeof和sizeof(string)的问题相关推荐
- C/C++基础::sizeof() 与 sizeof(string)
sizeof(string 对象) ≠ string 对象的.size()成员函数(.size()与.length()不作区别,返回 string 的字符个数) string 的实现在各库中可能有所不 ...
- sizeof和sizeof(string) (很好的文章,逻辑清楚,解释了很多模糊的概念)
今天看<程序员面试宝典>一书(为了应付将要到来的微软笔试),看到了sizeof(string)这个问题.在Dev C++上测试的结果是4,很不明白.上网搜了一下,得到如下结果: strin ...
- 【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )
文章目录 一.指针退化验证 二.完整代码示例 一.指针退化验证 nnn 维数组 作为 函数参数 , 会退化为 指针 , 注意这里只有 最高维 第 nnn 维 会 退化为指针 , 该指针指向 若干 n− ...
- ((sizeof(n)+sizeof(int)-1)~(sizeof(int)-1))
一.问题的提出 两年之前我写过一篇可变参数学习笔记,里面曾经简单的解释过一句: 代码 ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) 的作用是在考虑字 ...
- php sizeof函数,sizeof()的简单介绍
(一)基本概念 sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. (二)使用方法 1.用于数据类型 sizeof使 ...
- 关于sizeof(arr)/sizeof(arr[0])解读(plus细节讲解增加)
大家肯定经常看到 sizeof(arr)/sizeof(arr[0]) 这串代码 并且知道这是求一个数组内含多少个成员 我们先来看看sizeof(arr)的意思 sizeof(arr)是求arr这个数 ...
- 函数中使用sizeof(arr) / sizeof(arr[0])求数组长度不正确的原因
参考文章:c中自定义函数通过sizeof来输出数组的长度为何不正确?[原创] 错误原因 我们可以使用sizeof(arr) / sizeof(arr[0])求数组长度,但是要注意:sizeof()函数 ...
- 解决自己的小问题sizeof(ages) / sizeof(ages[0])是干嘛的
来到数组这里是不是遇到sizeof(ages) / sizeof(ages[0])有点懵??可能我比较菜,查了半天我发现这里还是没把这个弄清楚,那么这个是什么意思呢??有什么作用呢 #include ...
- c语言sizeof char,sizeof(char),sizeof(char*),sizeof(char[4]),
32位系统,地址长度是32位(bit),也就是4Byte;64位系统,地址长度是64位(bit),也就是8Byte 运用1: char a[] = "hello world"; / ...
- loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt (sizeof (_nl_value_type_LC_TIME) / sizeof
安装禅道的时候报错: root@nuoniu-System-Product-Name:/opt# /opt/zbox/zbox -ap 8950 php: loadlocale.c:130: _nl_ ...
最新文章
- 干货回顾丨机器学习笔记-----AP(affinity propagat)算法讲解及matlab实现
- js实时获取系统当前时间
- vr体验馆项目_VR安全体验馆在江苏方洋项目推广应用啦!
- 【python数据挖掘课程】二十五.Matplotlib绘制带主题及聚类类标的散点图
- Android的屏幕适配之图片加载适配
- Stanford CoreNLP服务器
- 镜像css3,CSS下镜像翻转(水平/垂直翻转)
- 126邮箱登录html,126邮箱登陆界面
- flutter ListView.separated使用
- 快速给网站加一个赞赏码功能
- 请你根据微信登录界面设计测试用例
- 独家出品 | 培训机构免费资源汇总
- Makefile语法基础
- 八爪鱼爬取列表数据和详情页数据(国内网址)
- LCD1602液晶显示屏的入门级应用(一)
- 单片机复位后为什么要对sp重新赋值_单片机常用名词解释与常用逻辑电路
- 【RPA自动化|提升办公效率|懒人必备】微信自动点赞
- spark源码-shuffle原理分析-1-ShuffleWriter
- 基于时空网络的出租车OD需求预测-简介
- GPU上大规模稀疏矩阵特征值计算高效算法之三——SLEPc测试
热门文章
- php e notice,PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
- wordpress拒绝访问_Nginx + Wordpress页面或帖子URL返回拒绝访问
- 培智计算机教学论文,【培智数学论文】_培智数学教学论文
- 倒果汁c语言,水果榨汁补维生素C?这些补维生素的错误别再犯了
- leetcode21 合并两个链表
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
- Linux(14)-正则表达式
- 算法(28)--矩阵搜索系列
- 面试题汇总---深度学习(图像识别,NLP内容)
- 《Python Cookbook 3rd》笔记(3.1):数字的四舍五入