c++字符串/容器分配
C++ string / container allocation
对于不熟悉c++的人来说,这可能是显而易见的,但它让我有点困惑——类的字符串成员是否在该类中分配了可变数量的空间?或者它只是在内部分配一个指针到内存中的其他空间?例如:
class Parent {
public:
vector<Child> Children;
}
class Child {
public:
string Name;
}
如果我创建一个"new Parent()"并添加一些具有不同长度字符串的孩子,如何在堆上分配?父级是4个字节,子级是4个字节(或者无论指针大小,加上固定大小的内部数据),然后是堆上其他地方的随机字符串堆?还是在记忆中捆绑在一起?
我猜在一般情况下,容器类型总是固定大小的自己,只是包含指针到他们的可变大小的数据,数据总是在堆上吗?
c++中的类总是固定大小的。当存在可变大小的组件时,例如向量的元素或字符串中的字符,它们可以在堆上分配(对于小字符串,它们也可以嵌入到字符串本身中;这被称为小字符串优化()。也就是说,您的Parent
对象将包含std::vector<Child>
,其中Child
对象在堆上分配(std::vector<...>
对象本身可能保留三个单词的数据,但有几种方式可以布局)。Child
中的std::string
对象分配自己的内存。也就是说,可能会有相当多的内存分配。
c++ 2011标准彻底定义了分配器,以支持向对象及其所有子对象传递分配机制。当然,类也需要支持这种机制。如果您的Parent
和Child
类具有接受分配器的合适构造函数,并将该分配器传递给执行分配的所有成员,则该分配器将通过系统传播。通过这种方式,可以将属于一起的对象分配到相当接近的位置。
c++中的类总是有固定的大小。因此vector
和string
只能包含指向堆分配内存*的指针(尽管它们通常包含比一个指针更多的数据,因为它也需要存储长度)。因此,对象本身总是有一个固定的长度。
*对于string
,这并不完全正确。通常使用一种称为短字符串优化的优化技术。在这种情况下,小字符串被嵌入到对象中(在指向堆数据的指针存储的地方),堆内存只在字符串太长时才分配。
是的——用你的话来说——容器类型本身总是固定大小的,并且只包含指向其可变大小数据的指针。
如果我们有vector<int> vi;
, vi
的大小总是固定的,确切地说,sizeof(vector<int>)
的大小是固定的,无论vi
中int
的数量如何
类的字符串成员是否在该类中分配可变数量的空间?
不,它没有。
或者它只是在内部分配一个指针到内存中的其他空间?
不,它没有。
一个std::string
分配任何sizeof(std::string)
。
不要混淆
- 对象的大小
- 对象所负责的资源的大小。
- 用字符串的向量分配字符串向量
- 在C++中动态分配字符串数组
- 分配字符串uint8_t
- 如何分配字符串来提升野兽multi_buffer
- 分配字符串时EXCEPTION_ACCESS_VIOLATION
- 使用带有动态分配字符串的strcpy_s()和strcat_s()
- 如何分配字符串文本
- C 循环不重新分配字符串值
- 如何在C 中分配字符串数组
- 动态内存分配 C++ 字符串
- 如何存储可以分配字符串的数值
- 通过引用传递结构并分配字符串
- 动态分配字符串文字
- 分配字符串数组时出现分段错误
- 如何从 Arduino 的 C++ 类中的构造函数中分配字符串字段
- 动态分配 C 字符串内存,无需先询问用户输入时间
- 分配字符串时出现 char* 新建和删除 [] 错误
- C++正在记住指向已分配字符串的指针
- 在结构中分配字符串时出现 Seg 错误
- 指向字符串的指针,可用于动态分配字符串数组