【发布时间】:2021-10-24 06:56:15
【问题描述】:
在https://en.cppreference.com/w/cpp/memory/align 中有一个space 参数,即“缓冲区大小”。这里的缓冲区大小是什么意思?
这就像您必须使用的空间量来创建设计的对齐方式吗?如果是,为什么需要它?
【问题讨论】:
在https://en.cppreference.com/w/cpp/memory/align 中有一个space 参数,即“缓冲区大小”。这里的缓冲区大小是什么意思?
这就像您必须使用的空间量来创建设计的对齐方式吗?如果是,为什么需要它?
【问题讨论】:
您必须考虑为什么要对齐指针。
考虑这样一种情况,您有一个已分配的内存范围供您在其中创建对象。这称为内存缓冲区。缓冲区的大小是从范围开始到结束的字节数。每个对象都有一个类型。每种类型都有对齐要求。该类型的对象只能在与所需字节边界对齐的地址中创建。
假设内存范围的第一个地址未与您要创建的对象类型所需的字节边界对齐。在这种情况下,您不能在内存范围的开头创建对象。这就是您需要std::align 的地方。它将给定的指针调整到下一个对齐的地址,这是可以创建对象的第一个地址。
为此,您只需要知道地址和对齐方式。但是您还需要知道对齐后对象是否可以放入您的内存范围内。例如,如果您有 16 字节的内存并且想要创建一个 16 字节的对象,但第一个地址未与 4 字节边界对齐,因此如果您从调整(对齐)地址开始创建对象,那么它会按调整后的字节数溢出内存范围。所以为了知道这一点,我们还要传递对象的size和内存的大小space。如果对象不适合,则 std::align 返回 null。
我们可能还想在该内存缓冲区中创建多个对象,因此我们需要知道指针已经调整了多少,以便我们可以找出可以在哪里创建下一个对象。这就是为什么space 是一个非常量引用参数。如果对象适合,该函数会从space 中扣除对齐的字节数。
【讨论】:
space 可用?
它是一个输入输出参数。所以它会做两件事:
仅当可以将通过给定对齐方式对齐的所需字节数放入缓冲区时,该函数才会修改指针。如果缓冲区太小,函数什么也不做,返回 nullptr。
【讨论】: