gpt4 book ai didi

c++ - 这个 C++ 代码是可移植的吗? (假设多维数组有连续的内存布局)

转载 作者:IT老高 更新时间:2023-10-28 22:04:12 26 4
gpt4 key购买 nike

首先,如果我犯了任何语法错误等,对不起我的英语......

我的问题是,当我们有一个二维数组时,如果我是对的,从计算机和 C/C++ 的角度来看,它只是一个长的一维数组,索引只是帮助编译器映射到具体地址。

这个代码片段在 Visual C++ 中工作,但是我想知道,这个代码是否可移植符合 标准 (C++98),不会对其他架构和/或操作系统造成意外:

int arr[][3] = { 1, 5, 3, 7, 5, 2, 7, 8, 9 };
const int ARR_NUM = sizeof(arr) / sizeof(int);

int* ptr = reinterpret_cast<int*>(arr); // NOT: int(*)[][3] !!!
for (int i = 0; i < ARR_NUM; ++i) {
cout << ptr[i] << endl;
}

最佳答案

标准

多维数组的元素按行优先顺序存储,因此手动索引是可移植的:

C++98、8.3.4/1:

An object of array type contains a contiguously allocated non-empty set of N sub-objects of type T.

显然,对于多维数组,这会递归地应用。

但是,reinterpret_cast 的这种使用是不可移植的。标准说 (C++98, 5.2.10/1)

[...] otherwise, the result is an rvalue and the [...], array-to-pointer, [...] standard conversions are performed on the expression v.

换句话说,传递 arr 会立即触发数组衰减到指向其第一个元素的指针。然后是 (C++98, 5.2.10/3) 包罗万象

The mapping performed by reinterpret_cast is implementation-defined.

本节的其余部分列出了一些异常(exception)情况,指定了始终明确定义的强制转换。鉴于它们都不适用于此处,因此结论是从技术上讲,它是默认实现定义的。

最终结论

从理论上讲,这是不可移植的。实际上,只要架构相同(例如 x86),我当然希望 Actor 能够可靠地工作。

幸运的是,您不必假设这样的事情,因为 others have mentioned ,像 int* ptr = arr[0] 这样的东西做同样的事情并且保证可移植。

关于c++ - 这个 C++ 代码是可移植的吗? (假设多维数组有连续的内存布局),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10618473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com