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

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

最佳答案

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

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

关于c++ - 用 std/tr1/boost::array 替换内置数组总是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7927994/

相关文章:

c++ - 为什么在创建类对象数组时不能调用参数化构造函数?

c++ - +=、|=、&= 等是原子的吗?

c - 数组、分配、困惑

javascript - 如何使用对象数组创建对象

C程序从数组中减去不同的数字

c++ - VC++中使用的不同符号

c++ - 是否值得将局部变量设为静态以防止不断重新创建?

c++ - std::vector 调整大小方法背后的设计原理是什么?

c++ - OpenCV - 缺少调试 DLL 库

c++ - 使用混合 C/C++ header 在 C 中使用 C++ 对象