gpt4 book ai didi

c++ - 指针减法和替代方案

转载 作者:可可西里 更新时间:2023-11-01 16:19:04 33 4
gpt4 key购买 nike

在处理数组时,标准算法(在 C 和 C++ 中)通常返回指向元素的指针。有时拥有元素的索引很方便,也许可以索引到另一个数组,我通常通过从指针中减去数组的开头来得到它:

int arr[100];
int *addressICareAbout = f(arr, 100);
size_t index = addressICareAbout - arr;

这似乎总是足够简单和有效。然而,最近有人向我指出,指针减法实际上返回一个 ptrdiff_t,原则上,如果“index”不适合,可能会出现问题一个 ptrdiff_t。我真的不相信任何实现都足以允许一个人创建如此大的 arr(从而导致此类问题),但公认的答案 here承认这是可能的,而且我没有发现任何其他证据。因此,我已经接受了这种情况(除非有人可以说服我)并且会小心前进。该答案提出了一种相当复杂的“安全”获取索引的方法;真的没有更好的了吗?

也就是说,我对 C++ 中可能的解决方法感到困惑。我们有 std::distance,但是 std::distance(arr, addressICareAbout) 是否保证定义明确?一方面,(指向第一个元素的指针)arr 可以递增以达到 addressICareAbout(对吗?),但另一方面 std: :distance 应该返回一个 ptrdiff_t。标准容器的迭代器可能(大概)有同样的问题。

最佳答案

极不可能有两个指针指向同一个数组,其中的差异不适合 ptrdiff_t。

在 64 位实现上,ptrdiff_t 是 64 位签名的,因此您需要一个 80 亿千兆字节的数组。在 32 位实现上,通常你的总地址空间被限制在 3 GB,如果你幸运的话是 3 1/4 GB(它是地址空间,而不是 RAM,这很重要),所以你需要一个超过 2 GB 的数组不会为其他任何事情留下太多。 malloc 很有可能一开始就拒绝分配该大小的数组。当然是你的判断。

虽然 std::distance 有优势,但我怀疑它与 ptrdiff_t 有相同的理论问题,因为距离可以是正的也可以是负的,并且它可能不是 32 位实现上的 64 位类型。

请注意,如果您可以在 32 位实现上分配一个 3 GB 的数组,并且您有两个 int* 到该数组的第一个和最后一个元素,即使指针差异计算不正确,我也不会感到惊讶尽管结果适合 ptrdiff_t。

关于c++ - 指针减法和替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30123334/

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