boost::array
(或tr1
或std
版本)在内置数组中提供了一些不错的附加功能。
到目前为止,我们的代码库只包含内置数组,例如(组成,但样式匹配):
WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
...
我想有人会明白这个想法。
现在,我的问题是,对于代码中的那些位置,boost::array
中的删除是有意义的(因为进行了其他更改),array
是100%语义保留为内置数组? (可能的编译器错误是正常的 - 只有沉默的行为改变才会困扰我。)
也就是说,可能以上代码被重写(例如)使用:
boost::array<WORD, FLAGS_MAX> m_lastReadFlags;
和memcpy(可能适合使用c_array()
或data()
)和其他类似阵列的访问将保持不变? 是的,当然我也可以用数组替换本地缓冲区并删除memcpy
或使用std::copy
或类似的东西,但这个问题的关键在于内置的兼容性在数组和数组类中。
更新:特别困扰我的一件事就是将内置数组用作指针的地方(如memcpy
情况)。是否会发生所有事件
编译/正确处理?
如何分配?
T arr1[N]; // or array<T, N>
T arr2[N]; // or array<T, N>
T* p1;
...
// Note, not all combinations will compile:
arr1 = arr2;
p1 = arr1;
arr2 = p1;
...
答案 0 :(得分:5)
是的,这应该没问题,因为array
类恰好是自动数组的包装器。它具有相同的访问语法和方括号,如果你需要获取指针,你知道如何做到这一点。你甚至可以在任何地方使用std::copy
并使用迭代器;无论如何,这将由memcpy
实施。
array
类是聚合类型(没有非平凡的构造函数/析构函数/赋值),因此您可以使用传统的聚合(大括号)初始化程序对其进行初始化,就像一个普通阵列。