在C语言中我们操作字符串肯定用到的是指针或者数组,这样相对来说对字符串的处理还是比较麻烦的,好在C++中提供了 string 类型的支持,让我们在处理字符串时方便了许多。这篇文章并不是讲解 string 类型的用法,而是讲解我个人比较好奇的问题,就是 string 类型占几个字节。

      首先,我写了一段测试代码,如下所示:

#include <iostream>
using namespace std;

int main(void)
{
	string str_test1;
	string str_test2 = "Hello World";

	int value1, value2, value3;

	value1 = sizeof(str_test1);
	value2 = sizeof(str_test2);
	value3 = sizeof(string);

	cout<<"str_test1占 "<<value1<<" 个字节"<<endl;
	cout<<"str_test2占 "<<value2<<" 个字节"<<endl;
	cout<<"string占 "<<value3<<" 个字节"<<endl;

	system("pause");
	return 0;
}

首先,我用G++编译运行,得到的结果如下图所示:

这说明string占4个字节。

之后,我用VS2012编译运行,得到的结果如下图所示:


奇怪,这里string竟然占28个字节。

这里,我们注意观察,还会发现一个问题,不管有没有对string类型的变量赋值,或者是赋什么值,得到的结果是一样的。


下面,来解释上述问题:

      string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string
里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配
的,与sizeof()无关。    sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()
为12、32字节的库实现。
通常,我们所用到的 string 类型一般都会是这样实现:
class
{
      char *_Ptr;    //指向字符串的指针
      int _Len;      //字符串的长度
      ........
};

      所以,我们一般接触到的string类型所占字节数为 8+。

C++ string类型占几个字节的更多相关文章

  1. java中boolean类型占几个字节

    java的基本数据类型中,boolean只有两种状态,默认值为false.取值范围是{true,false},理论上占1bit,实际上: 1.单个的boolean 类型变量在编译的时候是使用的int ...

  2. Object o = new Object()占多少个字节?-对象的内存布局

    一.先上答案 这个问题有坑,有两种回答 第一种解释: object实例对象,占16个字节. 第二种解释: Object o:普通对象指针(ordinary object pointer),占4个字节. ...

  3. Redis中一个String类型引发的惨案

    ​      曾经看到这么一个案例,有一个团队需要开发一个图片存储系统,要求这个系统能快速记录图片ID和图片存储对象ID,同时还需要能够根据图片的ID快速找到图片存储对象ID.我们假设用10位数来表示 ...

  4. Java String类型数据的字节长度

    问题描述: 向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校验,如果数据是纯英文,没有问题,但是如果数据 ...

  5. 一个int类型究竟占多少个字节

    一个int占多少个字节? 这个问题我们往往得到的答案是4. 可是int究竟占多少个字节,却跟你的机器环境有关. As you can see, the typical data type sizes ...

  6. 字节数组与String类型的转换

    还是本着上篇文章的原则,只不过在Delphi中string有点特殊! 先了解一下Delphi中的string 1. string = AnsiString = 长字符串,理论上长度不受限制,但其实受限 ...

  7. long类型在内存中占8个字节,float类型在内存中占4个字节,为什么long还要比float小呢?

    结论:数值范围大小和占用的字节没有关系. float类型的范围: 负数:-3.402823E38~-1.401298E-45 整数:0 正数:1.401298E-45~3.402823E38 long ...

  8. C#中字节数组byte[]和字符串string类型的相互转换

    C#中字节数组byte[]和字符串string类型的相互转换: string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBy ...

  9. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

随机推荐

  1. 【GDOI】【图论-最短路】时间与空间之旅

    最近打的一场校内训练的某题原题... 题目如下: Description 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spa ...

  2. 【USACO12JAN】视频游戏的连击Video Game Combos

    题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...

  3. [USACO Dec06]产奶的模式

    Description 农夫约翰发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. 约翰的牛奶按质量可以被 ...

  4. poj 1265 Area 面积+多边形内点数

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5861   Accepted: 2612 Description ...

  5. *hdu 5536(字典树的运用)

    Input The first line of input contains an integer T indicating the total number of test cases. The f ...

  6. 浅谈MySQL中优化sql语句查询常用的30种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  7. HTTPS介绍

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  8. Linux允许、禁止ping包

    默认情况下Linux系统允许ping,但是在某些情况下为了安全起见,我们都把服务器设置为禁ping  临时允许ping命令可使用命令: echo 0 >/proc/sys/net/ipv4/ic ...

  9. MySQL数据库将多条记录的单个字段合并成一条记录

    原SQL AND acc.id = accRole.acc_id) AND accRole.role_id = T_PM_ROLE.id ORDER BY acc.id 结果,有一个人有两个角色,如果 ...

  10. 在confluence中出现Handshake failed due to invalid Upgrade header: null

    在confluence中出现Handshake failed due to invalid Upgrade header: null 昨天晚上同事说confluence写完日志保存不了,然后我登陆co ...