【问题标题】:Is it always safe to replace a built-in array with a std/tr1/boost::array?用 std/tr1/boost::array 替换内置数组总是安全的吗?
【发布时间】:2011-12-17 04:46:17
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    array 类是聚合类型(没有重要的构造函数/析构函数/赋值),因此您可以使用传统的聚合(大括号)初始化器对其进行初始化,就像普通数组一样.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多