首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我们应该为字符串数据类型导入#include <string>,而不是为其余数据类型导入?

为什么我们应该为字符串数据类型导入#include <string>,而不是为其余数据类型导入?
EN

Stack Overflow用户
提问于 2019-04-30 12:26:51
回答 3查看 222关注 0票数 3

我是C++的新手,我注意到在使用字符串时,应该包括:

代码语言:javascript
复制
#include <string>

我的问题是,为什么这是必要的,而不是像intfloat等这样的原语类型?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-30 12:49:06

看起来您来自Python或Javascript背景,其中String是原始数据类型。

在基本类型(在C++中称为基础类型)中没有字符串的C++中就不是这样了。但是intfloat属于基本类型。

在C++中,string是属于复合类型(而不是基本类型)类别的类类型。

有关C++类型系统的概述,请阅读此reference on types

票数 4
EN

Stack Overflow用户

发布于 2019-04-30 12:48:25

intfloat这样的类型是直接嵌入到C++语言本身的基本类型。它们非常简单,支持通常由处理器用一条指令直接完成的基本操作。虽然std::string接口可能让它看起来很简单,但实际上实现要复杂得多。

例如,int在存储数字的二进制表示形式的内存中可以只有4个字节。同时,std::string必须跟踪其长度和容量,并且在许多情况下具有额外的可用内存以允许扩展。添加两个int可以用单个处理器指令来完成,同时附加到std::string可能涉及分配新的内存块以便存储更长的字符串,复制内容,然后释放原始内存块。

由于与intfloat等原始类型的操作相比,字符串操作更为复杂,因此std::string是作为C++标准库容器(如std::vector )提供的,而不是原始类型,这就是它有自己的头文件的原因。

票数 2
EN

Stack Overflow用户

发布于 2019-06-05 08:31:04

在C++中,任何需要库的东西通常都有一个#include文件,必须使用该文件才能导入库中各种实体的声明(不过,这种工作方式绝对不应该与Python import语句混淆,总体思想类似)。这是必要的,因为C和C++是“静态类型”语言,所以声明你正在使用的东西的类型必须在你使用它之前可用。如果不是,编译器就无法检查您使用的类型是否正确。

在某种意义上,C(以及扩展的C++)可以被认为是“可移植的汇编语言”。这意味着在C和C++中被认为是语言原语的任何东西几乎总是被大多数CPU作为原语支持的。这意味着CPU寄存器可以通过一条指令以适当的方式保存和操作一个值。

并不是每个CPU都是这样的。例如,在系统上有C和C++的实现,它们的CPU不能容纳32位整数。但是,即使在这些系统上,long至少仍然是一个典型的32位整数,C编译器将发出几条指令,在多个步骤中将两个32位值相加。在C和C++的早期,浮点数通常是作为一个非常低级的库实现的,因为CPU不直接支持它们。

为了告诉您这有多重要,直到最近,C++都有一个register关键字,它的意思是提示编译器给定变量的值应该保存在CPU寄存器中。

string是任意长度的字符序列。世界上几乎没有(如果有的话)CPU可以直接表示这一点。因此,它不是原始类型,而是由C++代码库实现的类型。

如果你来自Python...在Python中,甚至没有语言构造可以通过将内容存储在单独的CPU寄存器中或使用单个CPU指令执行操作来直接实现。因此,语言直接支持的原始事物的概念要宽泛得多。库中的东西和原始语言构造之间的区别也不是很明显。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55913974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档