对于数组来说,std :: array转换的C-Style数组是否完全安全?

Sil*_*ter 15 c++ arrays disassembly c++11 stdarray

第一次提问者:)是否有可能在不破坏代码的情况下将全局c样式数组转换为std :: arrays?我正在开发一个项目,其中包括反编译旧游戏的源代码.我们已经设法重构了反汇编/反编译输出的大部分内容.因为它是自动的,所以仍然有像

  int a;
  int b[50];
  *(&a + 100) = xxx;
Run Code Online (Sandbox Code Playgroud)

要么

  int b[50];
  int a;
  *(&a - 100) = xxx;
Run Code Online (Sandbox Code Playgroud)

还有其他类型的疯狂指针算术,它们尚未手动重构.但我们想使用边界检查已经(可能)正确更改为数组的部分.

(忽略斜体文本,我只是为了保持评论的一致性)到目前为止,我发现每个数组都有一个问题:sizeof(class containing array)会改变.这可能会在某些周期中破坏代码,例如someclass somearray [100]; //例如(sizeof(somearray [0])== 50)是真的int指针=(int)somearray; 指针+ = 100((someclass)指针) - > doSomething(); .因为pointer +=100不是指向第二个元素,而是指向第一个元素,或者甚至是第0个元素,我不确定(不要忘记它是自动反编译的代码,因此是丑陋的).

我正在考虑将每个全局数组更改为std :: array以及在没有[]运算符的情况下访问数组的每个实例array._Elems.

如果我要在这样的代码中将全局数组更改为std :: arrays,是否会出现任何问题?

编辑 你是对的,大小不变.我在测试功能中出错了.所以我会扩展这个问题:

将每个c样式数组更改为std :: array是否安全?

编辑 我们当前的代码实际上只能在调试模式下运行,因为它不会移动变量.发布模式基本上在程序开始时崩溃.

编辑 因为这个问题似乎有些混乱,让我澄清一下:除了T elems [N]之外,是否有一些保证阵列中没有其他成员?我能指望拥有

array<array<int,10>, 10> varname;
int* ptr = &varname[0][0];
ptr += 10
Run Code Online (Sandbox Code Playgroud)

varname[1][0]无论实现细节如何,请确保ptr指向?虽然保证阵列是连续的,但我不确定这一点.该标准包含一个实现,但我不确定这是一个示例实现还是实际定义,每个实现应该遵循iterator和const_iterator是唯一的特定于实现的东西,因为只有那些具有实现定义的单词(I没有最新的指定,因此可能存在其他一些差异).

cma*_*ter 4

对于一维数组,这可能适用于所有情况,二维情况更棘手:

原则上,std::array<>模板可以只包含数组本身,因为它的长度参数是不需要存储的编译时变量。然而,您的 STL 实现可能选择存储它,或者它需要的任何其他数据。因此,虽然 '&a[n] == &a[0] + n' 适用于任何 std::array,但表达式 '&a[n][0] == &a[0][0] + n*arrayWidth' 可能不适用于“std::array < std::array, arrayHeight >”。

您仍然可能想用 STL 实现来检查 'sizeof(std::array < int, 100 >) == sizeof(int) * 100' 。如果是这样,即使替换二维数组也应该是安全的。