【发布时间】:2020-10-17 21:45:09
【问题描述】:
我有 2 个问题:
- 字符串变量使用多少 RAM?它是 28 字节,不管它包含多少个字符?
- 如果此类字符串的长度超过 28 个字符怎么办?是否需要多 2 倍(56 字节)?
【问题讨论】:
-
注意
sizeof()是一个编译时间常数。
我有 2 个问题:
【问题讨论】:
sizeof()是一个编译时间常数。
字符串变量使用多少内存?
C++ 没有 RAM 的概念。它只知道静态内存、自动内存和动态内存。如何实现这些取决于操作系统和编译器的特定细节。
string 对象通常存储在自动内存中(例如在线程的堆栈上),除非您通过 new 运算符将其显式分配到动态内存中(例如在堆上)。如果string 是使用new 分配的类/结构的成员,但它本身不是new'ed,那么它位于恰好由动态内存支持的自动内存中。
它是 28 字节吗?不管它由多少个字符组成?
在任何情况下,sizeof(string) 分配的字节数可能是也可能不是 28 个字节,具体取决于 string 的特定实现。但是是的,string 对象的大小在编译时是固定的,在运行时不会改变,无论字符串中存储了多少字符。
如果此类字符串的长度超过 28 个字符怎么办?是否需要多 2 倍(56 字节)?
string 的字符数据通常分配在动态内存中(除非长度很小并且string 实现了“短字符串优化”)。分配的大小将始终是string 的capacity(加上string 的allocator 的一点开销)。但是使用多少capacity 取决于string 的特定实现来决定。虽然capacity 可以随着字符的添加而增长,但它一次增长多少取决于实现。
【讨论】: