最近遇到一个令我困惑的问题,就是 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)的问题相关推荐

  1. C/C++基础::sizeof() 与 sizeof(string)

    sizeof(string 对象) ≠ string 对象的.size()成员函数(.size()与.length()不作区别,返回 string 的字符个数) string 的实现在各库中可能有所不 ...

  2. sizeof和sizeof(string) (很好的文章,逻辑清楚,解释了很多模糊的概念)

    今天看<程序员面试宝典>一书(为了应付将要到来的微软笔试),看到了sizeof(string)这个问题.在Dev C++上测试的结果是4,很不明白.上网搜了一下,得到如下结果: strin ...

  3. 【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )

    文章目录 一.指针退化验证 二.完整代码示例 一.指针退化验证 nnn 维数组 作为 函数参数 , 会退化为 指针 , 注意这里只有 最高维 第 nnn 维 会 退化为指针 , 该指针指向 若干 n− ...

  4. ((sizeof(n)+sizeof(int)-1)~(sizeof(int)-1))

    一.问题的提出 两年之前我写过一篇可变参数学习笔记,里面曾经简单的解释过一句: 代码 ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) 的作用是在考虑字 ...

  5. php sizeof函数,sizeof()的简单介绍

    (一)基本概念 sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. (二)使用方法 1.用于数据类型 sizeof使 ...

  6. 关于sizeof(arr)/sizeof(arr[0])解读(plus细节讲解增加)

    大家肯定经常看到 sizeof(arr)/sizeof(arr[0]) 这串代码 并且知道这是求一个数组内含多少个成员 我们先来看看sizeof(arr)的意思 sizeof(arr)是求arr这个数 ...

  7. 函数中使用sizeof(arr) / sizeof(arr[0])求数组长度不正确的原因

    参考文章:c中自定义函数通过sizeof来输出数组的长度为何不正确?[原创] 错误原因 我们可以使用sizeof(arr) / sizeof(arr[0])求数组长度,但是要注意:sizeof()函数 ...

  8. 解决自己的小问题sizeof(ages) / sizeof(ages[0])是干嘛的

    来到数组这里是不是遇到sizeof(ages) / sizeof(ages[0])有点懵??可能我比较菜,查了半天我发现这里还是没把这个弄清楚,那么这个是什么意思呢??有什么作用呢 #include ...

  9. c语言sizeof char,sizeof(char),sizeof(char*),sizeof(char[4]),

    32位系统,地址长度是32位(bit),也就是4Byte;64位系统,地址长度是64位(bit),也就是8Byte 运用1: char a[] = "hello world"; / ...

  10. 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_ ...

最新文章

  1. 干货回顾丨机器学习笔记-----AP(affinity propagat)算法讲解及matlab实现
  2. js实时获取系统当前时间
  3. vr体验馆项目_VR安全体验馆在江苏方洋项目推广应用啦!
  4. 【python数据挖掘课程】二十五.Matplotlib绘制带主题及聚类类标的散点图
  5. Android的屏幕适配之图片加载适配
  6. Stanford CoreNLP服务器
  7. 镜像css3,CSS下镜像翻转(水平/垂直翻转)
  8. 126邮箱登录html,126邮箱登陆界面
  9. flutter ListView.separated使用
  10. 快速给网站加一个赞赏码功能
  11. 请你根据微信登录界面设计测试用例
  12. 独家出品 | 培训机构免费资源汇总
  13. Makefile语法基础
  14. 八爪鱼爬取列表数据和详情页数据(国内网址)
  15. LCD1602液晶显示屏的入门级应用(一)
  16. 单片机复位后为什么要对sp重新赋值_单片机常用名词解释与常用逻辑电路
  17. 【RPA自动化|提升办公效率|懒人必备】微信自动点赞
  18. spark源码-shuffle原理分析-1-ShuffleWriter
  19. 基于时空网络的出租车OD需求预测-简介
  20. GPU上大规模稀疏矩阵特征值计算高效算法之三——SLEPc测试

热门文章

  1. php e notice,PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
  2. wordpress拒绝访问_Nginx + Wordpress页面或帖子URL返回拒绝访问
  3. 培智计算机教学论文,【培智数学论文】_培智数学教学论文
  4. 倒果汁c语言,水果榨汁补维生素C?这些补维生素的错误别再犯了
  5. leetcode21 合并两个链表
  6. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
  7. Linux(14)-正则表达式
  8. 算法(28)--矩阵搜索系列
  9. 面试题汇总---深度学习(图像识别,NLP内容)
  10. 《Python Cookbook 3rd》笔记(3.1):数字的四舍五入