这是一个可变长度数组还是没有?

时间:2014-09-16 21:51:03

标签: c++ arrays string

在我尝试创建没有动态内存的自定义字符串类时,我使用模板数组长度技巧。因为大小是作为模板参数传递的,所以在编译时就知道了。因此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);
}

希望通过这种方法,所有内存都在堆栈中,我不会遇到任何新问题,删除等问题。

2 个答案:

答案 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类。您可以在堆栈上构建一个带有自动缓冲区的分配器,并使其使用该缓冲区。