C 风格的字符串总是可以std::string
根据需要转换为。事实上,您从分析中观察到的结果很有可能是由于数据的碎片化而不是简单的分配数量,并且std::string
按需创建将是有效的。当然,不知道您的实际应用程序这只是一种猜测,并且实际上在经过测试之前无法知道这一点。我想象一个班级
class my_class {
std::string data() const { return self._data; }
const char* data_as_c_str() const // In case you really need it!
{ return self._data; }
private:
int _type;
char _data[1];
};
注意我使用了一个标准的聪明的 C 技巧来进行数据布局:_data
只要你想要它,只要你的工厂函数为其分配额外的空间。IIRC,C99 甚至为它提供了一个特殊的语法:
struct my_struct {
int type;
char data[];
};
这很有可能与您的 C++ 编译器一起工作。(这是在 C++11 标准中吗?)
当然,如果你这样做了,你真的需要将所有的构造函数设为私有,并且将你的工厂函数设为友元,以确保工厂函数是实际实例化的唯一方法my_class
——如果没有额外的内存,它就会被破坏大批。您肯定也需要将其设为operator=
私有,或者以其他方式谨慎实施。
重新考虑您的数据类型可能是一个好主意。
例如,您可以做的一件事是,与其尝试将char
数组放入结构化数据类型,不如使用智能引用。一个看起来像的类
class structured_data_reference {
public:
structured_data_reference(const char *data):_data(data) {}
std::string get_first_field() const {
// Do something interesting with _data to get the first field
}
private:
const char *_data;
};
您也希望对其他构造函数和赋值运算符做正确的事情(可能禁用赋值,并实现一些合理的移动和复制)。std::shared_ptr
而且您可能希望在整个代码中使用引用计数指针(例如),而不是裸指针。
另一种可能的技巧是只使用std::string
,但将类型信息存储在第一个条目(或前几个)中。当然,这需要在您访问数据时考虑到这一点。