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没有最新的指定,因此可能存在其他一些差异).
对于一维数组,这可能适用于所有情况,二维情况更棘手:
原则上,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' 。如果是这样,即使替换二维数组也应该是安全的。
归档时间: |
|
查看次数: |
2966 次 |
最近记录: |