std::align的使用问题

Usage Issue of std::align

本文关键字:问题 align std      更新时间:2023-10-16

考虑以下代码:

#include <memory>
#include <iostream>
#include <cstdio>
using namespace std;
// Visual Studio 2012 don't have alignof as a keyword.
#define alignof(type) __alignof(type) 
#define TEST_TYPE int
int main(int, char*[])
{
    TEST_TYPE i;
    void* pv = &i;
    size_t space = 100; // Just some big number.
    size_t alignment = alignof(TEST_TYPE);
    cout << "Alignment of int: " << alignment << endl;
    cout << "Is 'i' aligned: " 
         << (size_t(&i) % alignment == 0 ? "true" : "false" )
         << endl;
    if ( align(alignment, sizeof(TEST_TYPE), pv, space) )
    {
        TEST_TYPE* p = reinterpret_cast<TEST_TYPE*>(pv);
        cout << "Moved pointer " 
             << (size_t(p) - size_t(&i)) 
             << " bytes" 
             << endl;
        cout << "Is 'p' aligned: " 
             << (size_t(p) % alignment == 0 ? "true" : "false" )
             << endl;
    }
    else
    {
        cout << "Can't align 'i'" << endl;
    }
    return 0;
}

它创建一个(正确对齐的)整型,然后调用std::align作为整型的地址。我得到的输出是:

font: family:宋体

移动指针4个字节

表示指针被移动,即使地址已经正确对齐。然而,文档(http://en.cppreference.com/w/cpp/memory/align)说它"…修改PTR指向第一个可能的对齐存储地址。"但这不意味着指针应该保持不变吗?

所以我的问题是:如果参数指针已经对齐,那么std::align(指针)的第三个参数是否总是被更改为一个大小 ?

编辑

另外,如果指针没有改变,那么将不会在http://www.cplusplus.com/reference/memory/align/?kw=align的例子进入一个无限循环?

2日编辑

链接已更新,可能出现的问题已不复存在。

这看起来像是标准库实现中的错误,输出应该是"移动指针0字节",因为pv已经对齐,因此[pv,pv+100)范围内第一个正确对齐的地址是pv本身,而不是pv+4

虽然它在标准中说:

函数更新其ptr和space参数,以便可以用同一缓冲区

可能有不同的对齐方式和大小参数

我不确定这到底在说什么,或者它是否相关。我不这么认为。