【问题标题】:What is the "space" parameter in std::align?std::align 中的“空格”参数是什么?
【发布时间】:2021-10-24 06:56:15
【问题描述】:

https://en.cppreference.com/w/cpp/memory/align 中有一个space 参数,即“缓冲区大小”。这里的缓冲区大小是什么意思?

这就像您必须使用的空间量来创建设计的对齐方式吗?如果是,为什么需要它?

【问题讨论】:

    标签: c++ alignment buffer


    【解决方案1】:

    您必须考虑为什么要对齐指针。

    考虑这样一种情况,您有一个已分配的内存范围供您在其中创建对象。这称为内存缓冲区。缓冲区的大小是从范围开始到结束的字节数。每个对象都有一个类型。每种类型都有对齐要求。该类型的对象只能在与所需字节边界对齐的地址中创建。

    假设内存范围的第一个地址未与您要创建的对象类型所需的字节边界对齐。在这种情况下,您不能在内存范围的开头创建对象。这就是您需要std::align 的地方。它将给定的指针调整到下一个对齐的地址,这是可以创建对象的第一个地址。

    为此,您只需要知道地址和对齐方式。但是您还需要知道对齐后对象是否可以放入您的内存范围内。例如,如果您有 16 字节的内存并且想要创建一个 16 字节的对象,但第一个地址未与 4 字节边界对齐,因此如果您从调整(对齐)地址开始创建对象,那么它会按调整后的字节数溢出内存范围。所以为了知道这一点,我们还要传递对象的size和内存的大小space。如果对象不适合,则 std::align 返回 null。

    我们可能还想在该内存缓冲区中创建多个对象,因此我们需要知道指针已经调整了多少,以便我们可以找出可以在哪里创建下一个对象。这就是为什么space 是一个非常量引用参数。如果对象适合,该函数会从space 中扣除对齐的字节数。

    【讨论】:

    • 我们如何确定有多少space 可用?
    • @westcoaststudent 你只需要知道它。如果您不知道缓冲区的大小,那么您将无能为力。你怎么知道你有一个缓冲区?
    • 例如,如果你使用全局分配函数,那么你告诉分配器你想要多少字节。通过知道您请求的字节数,您就知道有多少字节。
    【解决方案2】:

    它是一个输入输出参数。所以它会做两件事:

    1. 告诉函数有多少可用空间,所以如果对齐会超出缓冲区,函数就会失败:

    仅当可以将通过给定对齐方式对齐的所需字节数放入缓冲区时,该函数才会修改指针。如果缓冲区太小,函数什么也不做,返回 nullptr。

    1. 函数可以输出对齐后还剩下多少空间,因此您可以将调用串在一起。如果您正在编写某种对齐的分配器,这将非常有用。

    【讨论】:

    • 既然它也是一个“输入”参数,我们如何在调用函数之前获取可用空间量?
    • @westcoaststudent 您创建了缓冲区。所以你知道你创造了多少空间。
    猜你喜欢
    • 1970-01-01
    • 2020-10-13
    • 2019-09-19
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多