c++ - 从 C 样式数组到 std::array 的转换对于数组来说是完全安全的吗?

标签 c++ arrays c++11 disassembly stdarray

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

  int a;
  int b[50];
  *(&a + 100) = xxx;

  int b[50];
  int a;
  *(&a - 100) = xxx;

还有其他类型的疯狂指针算法,尚未手动重构。但是我们想对已经(大概)正确更改为数组的部分使用边界检查。

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

我正在考虑将每个全局数组更改为 std::array 并将不使用 [] 运算符访问数组的每个实例更改为 array._Elems

如果我在这样的代码中将全局数组更改为 std::arrays 会出现什么问题吗?

编辑 你说得对,尺寸不变。我在测试功能中有错误。所以我将扩展问题:

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

编辑 我们当前的代码实际上只能在 Debug模式下运行,因为它不会移动变量。 Release模式基本上在程序启动时崩溃。

编辑 由于这个问题似乎有些困惑,让我澄清一下:除了 T elems [N] 之外,是否可以保证数组中没有其他成员? 我可以指望拥有

array<array<int,10>, 10> varname;
int* ptr = &varname[0][0];
ptr += 10

并确保 ptr 指向 varname[1][0] 而不管实现细节如何?尽管可以保证数组是连续的,但我对此不确定。该标准包含一个实现,但我不确定这是一个示例实现还是每个实现都应该遵守的实际定义 iterator 和 const_iterator 是唯一特定于实现的东西,因为只有那些有词 implementation-已定义(我手头没有最新的规范,因此可能存在一些其他差异)。

最佳答案

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

原则上,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'。如果是这样,即使替换 2D 数组也应该是安全的。

关于c++ - 从 C 样式数组到 std::array 的转换对于数组来说是完全安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16962973/

相关文章:

android - 无法使用 C++ 在 OpenGL ES 1.x 中绘制加载模型

php - 编写干净的多维数组

jquery - 如何在 Coldfusion 数组/对象中存储名称-值对?

c++ - 在 C++ 11 函数中处理非严重错误的推荐方法是什么

c++ - 如何将具有不同参数的 std::function 传递给同一函数

c++ - 内部类模板的非成员运算符重载

c++ - 为什么 std::lerp 不适用于任何已实现所需操作的类型?

c++ - 返回对 InputIterator 内部状态的引用是否合法?

java - 如何从 InputStream 中准确读取 4 个字节?

C++11:一种新语言?