第一次提问者:) 是否可以在不破坏代码的情况下将全局 c 样式数组转换为 std::arrays ?我正在开发一个项目,其中包括反编译旧游戏的源代码。我们已经设法重构了大部分反汇编/反编译输出。由于它是自动的,因此仍然有类似的部分
int a;
int b[50];
*(&a + 100) = xxx;
或者
int b[50];
int a;
*(&a - 100) = xxx;
以及剩余的其他类型的疯狂指针算法,尚未手动重构。但是我们想对已经(大概)正确更改为数组的部分使用边界检查。
(忽略斜体文本,我保留它只是为了在评论中保持一致)到目前为止,我发现每个数组都有一个问题:sizeof(class containing array)
会改变。这可能会在某些循环中破坏代码,例如 someclass somearray[100]; //例如 (sizeof(somearray[0]) == 50) 为真 int pointer = (int)somearray; 指针 += 100 ((someclass )pointer)->doSomething(); . 因为pointer +=100
不会指向第二个元素,而是第一个元素,甚至第零个元素,我不确定(不要忘记它是自动反编译的代码,因此很丑)。
我正在考虑将每个全局数组更改为 std::array 以及在没有[]
运算符 to的情况下访问数组的每个实例array._Elems
。
如果我在这样的代码中将全局数组更改为 std::arrays 是否会出现任何问题?
编辑 关于尺寸不变,你是对的。我在测试功能中有错误。所以我将扩展问题:
将每个 c 样式数组更改为 std::array 是否安全?
编辑 我们当前的代码实际上只能在调试模式下运行,因为它不会移动变量。发布模式基本上在程序开始时崩溃。
编辑 由于这个问题似乎有些混乱,让我澄清一下:除了 T elems [N] 之外,是否有一些保证数组中没有其他成员?我可以指望拥有
array<array<int,10>, 10> varname;
int* ptr = &varname[0][0];
ptr += 10
并确保 ptr 指向varname[1][0]
而不考虑实现细节?尽管可以保证数组是连续的,但我对此不确定。该标准包含一个实现,但我不确定这是一个示例实现还是每个实现都应该遵守的实际定义,迭代器和 const_iterator 是唯一特定于实现的东西,因为只有那些有实现定义的词(我手头没有最新的规范,因此可能存在一些其他差异)。