字符串数据类型如何存储为字节
How About string datatype is stored as bytes
问题
您好!
我的问题是关于以字节形式存储时的字符串数据类型值。
请参阅下面的代码:
有什么问题
int main(){
string name, names[6];
std::cout<<sizeof(name)<<endl; //32 bytes
std::cout<<sizeof "n"<<endl; //2 bytes
std::cout<<sizeof "//n"<<endl; //3 bytes
std::cout<<sizeof(names)<<endl; //192 bytes
}
有什么解释吗?
为什么会这样?谁能解释一下字符串数据类型如何存储自身?
对于初学者,此语句的输出
std::cout<<sizeof "//n"<<endl; //3 bytes
是4
.
在此声明中
std::cout<<sizeof(name)<<endl;
输出std::string
类型对象的大小。它不是存储在对象中的字符串的大小。要输出你应该写的字符串的大小
std::cout<<name.size()<<endl;
你会得到 0
因为对象不包含任何字符串。
因此,如果 std::string 类型的对象的大小等于 32,则包含 6 个此类对象的数组的大小为 6 * 32 = 192
。
在此声明中
std::cout<<sizeof "n"<<endl;
输出字符串文字 "n"
的大小,包含 2 个字符 ({ 'n', '[=20=]' }
),包括终止零。
并且在这个声明中
std::cout<<sizeof "//n"<<endl;
还有字符串文字大小的输出 "//n"
,包含 4 个字符,包括终止零。
基本上,一个std::string
对象只不过是一个指向实际字符串数据1的指针,以及一些关于它包装的字符串的信息(比如它的当前长度).可能还有其他特定于实现的数据推高了这个数字。
并且要了解像 "n"
这样的字符串文字的大小,您需要了解 C++ 中的所有字符串文字实际上都是常量字符数组,包括 字符串空终止符。所以例如"n"
实际上是两个字符的数组:'n'
字符和 '[=14=]'
字符串终止符。
这意味着你声称 sizeof "//n"
是三个字节是错误的,它实际上是四个字节。
最后,数组的大小就是数组的总大小。换句话说,每个元素的大小乘以元素的数量。
1 虽然这是 std::string
的 "classic" 观点,但并不总是正确的,因为通常有一些叫做 短字符串优化的东西 其中短字符串可以完全存储在 std::string
对象本身中。没有定义 "short string" 的标准化限制,它实际上是一个实现细节。
问题
您好! 我的问题是关于以字节形式存储时的字符串数据类型值。 请参阅下面的代码:
有什么问题
int main(){
string name, names[6];
std::cout<<sizeof(name)<<endl; //32 bytes
std::cout<<sizeof "n"<<endl; //2 bytes
std::cout<<sizeof "//n"<<endl; //3 bytes
std::cout<<sizeof(names)<<endl; //192 bytes
}
有什么解释吗?
为什么会这样?谁能解释一下字符串数据类型如何存储自身?
对于初学者,此语句的输出
std::cout<<sizeof "//n"<<endl; //3 bytes
是4
.
在此声明中
std::cout<<sizeof(name)<<endl;
输出std::string
类型对象的大小。它不是存储在对象中的字符串的大小。要输出你应该写的字符串的大小
std::cout<<name.size()<<endl;
你会得到 0
因为对象不包含任何字符串。
因此,如果 std::string 类型的对象的大小等于 32,则包含 6 个此类对象的数组的大小为 6 * 32 = 192
。
在此声明中
std::cout<<sizeof "n"<<endl;
输出字符串文字 "n"
的大小,包含 2 个字符 ({ 'n', '[=20=]' }
),包括终止零。
并且在这个声明中
std::cout<<sizeof "//n"<<endl;
还有字符串文字大小的输出 "//n"
,包含 4 个字符,包括终止零。
基本上,一个std::string
对象只不过是一个指向实际字符串数据1的指针,以及一些关于它包装的字符串的信息(比如它的当前长度).可能还有其他特定于实现的数据推高了这个数字。
并且要了解像 "n"
这样的字符串文字的大小,您需要了解 C++ 中的所有字符串文字实际上都是常量字符数组,包括 字符串空终止符。所以例如"n"
实际上是两个字符的数组:'n'
字符和 '[=14=]'
字符串终止符。
这意味着你声称 sizeof "//n"
是三个字节是错误的,它实际上是四个字节。
最后,数组的大小就是数组的总大小。换句话说,每个元素的大小乘以元素的数量。
1 虽然这是 std::string
的 "classic" 观点,但并不总是正确的,因为通常有一些叫做 短字符串优化的东西 其中短字符串可以完全存储在 std::string
对象本身中。没有定义 "short string" 的标准化限制,它实际上是一个实现细节。