在我尝试创建没有动态内存的自定义字符串类时,我使用模板数组长度技巧。因为大小是作为模板参数传递的,所以在编译时就知道了。因此char buffer[n]
不是可变长度数组。这是正确的思路吗?这是代码:
template<typename T, size_t n>
class string_test
{
using Type = T;
// Don't count NUL byte
size_t _size = n - 1;
char buffer[n]; // <--- variable length array?
public:
string_test(const char* str)
{
strcpy(buffer, str);
}
size_t size() const
{
return _size;
}
const char* c_str() const
{
return buffer;
}
};
template<typename T, size_t n>
string_test<T, n> make_string(const T (&str)[n])
{
return string_test<T, n>(str);
}
希望通过这种方法,所有内存都在堆栈中,我不会遇到任何新问题,删除等问题。
答案 0 :(得分:3)
是的,您的想法是正确的:buffer
不是VLA。
希望通过这种方法,所有内存都在堆栈中,我不会遇到任何新问题,删除等问题。
这也是正确的,因为您不需要手动管理任何内存。
string_test<T, m>
时,string_test<T, n>
和m != n
是一种(可能很重要的)皱纹。
一般来说,简单地使用std::vector<T>
似乎更合适。这将导致直接但正确的代码,几乎没有内存错误的范围。
答案 1 :(得分:0)
代码和思想没有错;并将按原样运作。
我会质疑实现它的动机和方法。在边界检查方面,该类是不安全的。例如,如果ctor被赋予超过容量的字符串,则为BANG。
堆内存管理尽可能高效,我不预见99.99%应用程序的性能问题。如果你真的试图挤压最后的CPU性能下降,也许使用STL不是正确的选择。您应该使用手工优化的算法将自己局限于经典的C风格编程。
最后,我在第二个PaulMcKenzie之上,如果你想为任何容器(包括字符串)定制内存管理,请使用带有自定义分配器的std类。您可以在堆栈上构建一个带有自动缓冲区的分配器,并使其使用该缓冲区。