在一个结构向量中,我应该在结构中使用char[]而不是std::string,这样它们就是POD
In a vector of structs, should I be using char[] instead of std::string in structures so that they are POD?
我有几个大的(100000到10000000)对象向量。我应该坚持这样的结构吗:
typedef struct {
char name[64];
int number;
long offset;
}
而不是:
typedef struct {
std::string name;
int number;
long offset;
}
我想重用包含大量对象的向量,但我担心当我调用clear()时,如果我使用带有std::string的结构,我最终会调用1000000个析构函数。
这是使用std::string与char[]的常见问题吗?
如果您的大多数字符串都比64个字符短得多,那么您可能会考虑对它们进行内存池。如果你只添加到向量中,然后在某个时候擦除整个向量,那么效果最好。这样,您就可以将字符串紧密地封装在内存中,只需在结构中存储一个char*
。
但是,对于内存池和string
,字符串数据存储在结构之外的某个位置,这会影响缓存位置。如果您使用内存池,则局部性会更好,因为您可以将许多字符串打包到大块内存中,但它们仍然与其他结构数据相去甚远。如果您的程序从缓存中获得了显著优势,那么您将希望将字符串作为char
数组保持内联。
现在的许多字符串类实现都足够智能,可以将短字符串存储在对象内部,而不是堆上。在这些情况下,std::string
的析构函数是便宜的。
快速检查是查看&str[0]
是否指向str
。
相关文章:
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- <string> 结构中的矢量无法正常工作
- 使用具有 string.reserve() 的字符串实例化结构
- 无法迭代结构"string"的哈希映射:[列表] C++
- 数据结构对齐:为什么Char和STD :: String的数组不同
- 在结构的联合成员中使用std::string时,无法引用默认构造函数
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- 如果将键定义为std :: string,则存储在REDIS中的POD结构的验证将失败
- 如何将STD :: String的值复制到Char数组类型的结构成员
- Python 数据结构:map<string、vector<int>>
- 如何将 std::vector<std::string> 转换为 boost::spirit 中结构的成员?
- 使用 std::write 和 std::read C++ 读取包含 std::string 到.dat文件的结构
- 如何才能将字符串复制到带有 std::string 字段的结构中
- std::string 或 char[] 作为大型数组状结构的元素
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 在一个结构向量中,我应该在结构中使用char[]而不是std::string,这样它们就是POD
- 当传入具有std::string成员的结构时,C++-gdb会给出意外的输出
- 为什么BoostSpirit正确地将标识符解析为std::字符串,而不是解析为仅由std::string组成的自适应结构
- 在C++中循环向量结构<string>
- 如何根据要排序的向量中的向量对结构<string>向量进行排序?