用std / tr1 / boost :: array替换内置数组总是安全的吗?

时间:2011-10-28 10:20:19

标签: c++ arrays visual-c++ boost refactoring

boost::array(或tr1std版本)在内置数组中提供了一些不错的附加功能。

到目前为止,我们的代码库只包含内置数组,例如(组成,但样式匹配):

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;
...

1 个答案:

答案 0 :(得分:5)

是的,这应该没问题,因为array类恰好是自动数组的包装器。它具有相同的访问语法和方括号,如果你需要获取指针,你知道如何做到这一点。你甚至可以在任何地方使用std::copy并使用迭代器;无论如何,这将由memcpy实施。

array类是聚合类型(没有非平凡的构造函数/析构函数/赋值),因此您可以使用传统的聚合(大括号)初始化程序对其进行初始化,就像一个普通阵列。

相关问题