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;
...
最佳答案
是的,这应该没问题,因为 array
类恰好是自动数组的包装器。它具有与方括号相同的访问语法,如果您需要获取指针,您知道该怎么做。您甚至可以在任何地方使用 std::copy
并使用迭代器;无论如何,memcpy
很可能会实现它。
array
类是聚合类型(没有非平凡的构造函数/析构函数/赋值),因此您可以使用传统的聚合(大括号)初始化器对其进行初始化,就像普通数组一样。
关于c++ - 用 std/tr1/boost::array 替换内置数组总是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7927994/