分配函数和返回的指针

Posted

技术标签:

【中文标题】分配函数和返回的指针【英文标题】:Allocation function and pointer to returned 【发布时间】:2014-07-18 18:20:29 【问题描述】:

我不明白合适的指针对齐概念:

对分配的存储内容没有限制 从分配函数返回。顺序、连续性和 由连续调用分配的存储的初始值 分配函数未指定。返回的指针应为 适当对齐,以便可以将其转换为任意指针 具有基本对齐要求的完整对象类型 (3.11) 然后用于访问分配的存储中的对象或数组 (直到通过调用 相应的释放函数)。

sec.3.11 中没有适当对齐的定义。你解释一下应该是什么意思?

【问题讨论】:

如果您询问有关特定标准引号的问题,使用 C 和 C++ 进行标记并没有真正的帮助。对于 C:aligned 已定义。 看这里:***.com/questions/8752546/… 你在这里跳了一个兔子洞。如果不产生一堵文字墙,这个问题就不容易回答。此外,大多数程序员需要理解它是相当不寻常的。一些上下文可能对我们有所帮助。为什么你想知道对齐是什么? @Deduplicator 哪里有合适的对齐定义? What exactly is an aligned pointer? 【参考方案1】:

这意味着对于任何具有基本对齐的完整对象类型,应该可以将返回的指针转换为指向该对象类型的指针,同时尊重该对象类型的对齐要求。

实际上,由于对齐是 2 的幂,这意味着需要分配函数来返回与 alignof(std::max_align_t) 对齐的指针。

“合适的对齐方式”没有单独的定义;在本段中和其他地方一样,“适当地”仅表示程序需要满足该段其余部分的要求。

【讨论】:

alignof(std::max_align_t)=16,但任何类型 T 的 alignof(T*)=8。 “合适的对齐方式”没有单独的定义这就是我想知道的!谢谢:)。【参考方案2】:

§3.11/1 说,

对象类型具有对齐要求(3.9.1、3.9.2),这些要求限制了对象所在的地址。 可以分配该类型的对象。

因此,如果一个指针“适当对齐”,则意味着该指针表示的地址满足这些限制。这对于地址的数值究竟意味着什么是实现定义的。

【讨论】:

也就是说,我们可以从合适的对齐中删除合适的字而不失去意义。 @St.Antario 我想是的,是的。【参考方案3】:

对齐由操作系统和平台定义。通常它是最大基本类型的大小(指针或double),但也可能更大。例如,在 Windows 上,x86 为 8 字节,x64 为 16 字节。

【讨论】:

值得注意的是,x86/x86_64上最大的基本类型实际上是long double,大小为10字节。 在 MSVC 32 和 64 位代码中,long double 映射为 double。

以上是关于分配函数和返回的指针的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数返回动态分配的指针数组?

指针做参数的动态内存分配与二重指针(上)

在方法中返回向上转换的指针时替代堆分配

关于函数返回值为指针类型的分析

知识分享:C/C++函数返回二维数组指针

分配并返回一个二维数组指针,其中行和列是运行时参数