在类中初始化可变长度的c-string

时间:2016-12-15 06:20:05

标签: c++ optimization

说我有一个 Uniform 这样的课程:

class Uniform {
public:
    Uniform(const char* name, size_t count, size_t elemSize, void* data);

private:
    size_t m_count;
    size_t m_elemSize;
    void* m_data;
    char m_name[];
}

有没有办法初始化 m_name ,以便包含的数据紧密包装?我不必在字符串上使用高水位标记(例如 char m_name [MAX_STR_LEN]; )或动态分配它。

3 个答案:

答案 0 :(得分:2)

如果您将其声明为char * m_name;在第一次分配后,它将采用有效的大小。 你也可以通过

来改变这一点
char * m_name = (char *)malloc(n * sizeof(char));//size_t count is the n

答案 1 :(得分:2)

flexible arrays是C99功能。使用std::stringstd::unique_ptr<char[]>char *m_name = new char[...

OR

使用模板

template <size_t size>
class Uniform {
public:
    Uniform(const char* name, size_t count, size_t elemSize, void* data);

private:
    size_t m_count;
    size_t m_elemSize;
    void* m_data;
    std::array<char, size> m_name;
}

答案 2 :(得分:1)

您需要动态分配动态内容。假设你有:

Uniform array[10];

或:

std::vector<Uniform> v;

如果每个Uniform具有可变大小,您期望索引如何工作? Uniform必须在编译时知道固定大小。