gpt4 book ai didi

c - 解释 "About size_t and ptrdiff_t"中的这段话

转载 作者:行者123 更新时间:2023-11-30 18:27:56 26 4
gpt4 key购买 nike

在此blog entry by Andrey Karpov entitled, "About size_t and ptrdiff_t"他总结道:

As the reader can see, using ptrdiff_t and size_t types gives some advantages for 64-bit programs. However, it is not an all-out solution for replacement of all unsigned types with size_t ones. Firstly, it does not guarantee correct operation of a program on a 64-bit system. Secondly, it is most likely that due to this replacement, new errors will appear, data format compatibility will be violated, and so on. You should not forget that after this replacement, the memory size needed for the program will greatly increase as well. Increase of the necessary memory size will slow down the application's work, for the cache will store fewer objects being dealt with.

我不理解这些说法,并且我没有在文章中看到它们,

"it is most likely that due to this replacement, new errors will appear, data format compatibility will be violated, and so on."

这怎么可能,迁移之前怎么可能没有错误,而类型迁移却导致错误呢?目前尚不清楚类型(size_tptrdiff_t)何时似乎比它们所替换的类型更具限制性。

You should not forget that after this replacement, the memory size needed for the program will greatly increase as well.

我不清楚所需的内存大小如何或为何会“大大”增加或根本增加?我明白,如果安德烈的结论确实如此。

最佳答案

这篇文章包含非常可疑的说法。

首先,size_tsizeof返回的类型。 uintptr_t 是一个整数类型,可以存储任何void的指针。

文章声称 size_tuintptr_t 是同义词。他们不是。例如,在具有大内存模型的分段 MSDOS 上,一个内存中元素的最大数量数组适合 16 位的 size_t,但指针需要 32 位。它们现在是我们常见的 Windows、Linux 平面内存模型的同义词。

更糟糕的是声称您可以在 ptrdiff_t 中存储指针,或者它与 intptr_t 同义:

The size of size_t and ptrdiff_t always coincide with the pointer's size. Because of this, it is these types which should be used as indexes for large arrays, for storage of pointers and, pointer arithmetic.

这根本不是真的。 ptrdiff_t 是指针减法的值的类型,但指针减法仅在两个指针指向同一个对象或紧随该对象之后定义,而不仅仅是内存中的任何位置时定义。

另一方面,ptrdiff_t 可以选择大于size_t - 这是因为如果您的数组大小大于MAX_SIZE/2 元素,如果 ptrdiff_t 宽度相同,则从指向最后一个元素的指针减去指向第一个元素的指针或超出的元素将产生未定义的行为>size_t。事实上,标准确实规定 size_t 只能为 16 位宽,但 ptrdiff_t 必须至少为 17]( http://port70.net/~nsz/c/c11/n1570.html#7.20.3 )。

在 Linux 上,ptrdiff_tsize_t 大小相同 - 和 it is possible to allocate an object on 32-bit Linux that is larger than PTRDIFF_MAX elements 。正如评论中指出的那样,标准不要求 ptrdiff_t 甚至与 size_t 具有相同的等级,尽管这样的实现纯粹是邪恶的。

如果要遵循建议并使用 size_tptrdiff_t 来存储指针,肯定无法正确.

<小时/>

至于声称

You should not forget that after this replacement, the memory size needed for the program will greatly increase as well.

我对这一说法提出异议 - 与一般 64 位对齐、堆栈对齐和迁移到 64 所固有的 64 位指针所带来的已经存在的消耗增加相比,内存需求的增加相当适度位环境。

至于声称

"it is most likely that due to this replacement, new errors will appear, data format compatibility will be violated, and so on."

这当然是正确的,但很可能如果您正在编写这样有缺陷的代码,您可能不小心在过程中“修复”旧错误,例如signed/unsigned int 示例:

int A = -2;
unsigned B = 1;
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
ptr = ptr + (A + B); //Error
printf("%i\n", *ptr);

原始代码和新代码都会有未定义的行为(越界访问数组元素),但新代码在 64 位平台上似乎也是“正确的”。

关于c - 解释 "About size_t and ptrdiff_t"中的这段话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51219667/

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