用法问题std :: align

时间:2013-04-30 17:04:04

标签: c++ c++11 std memory-alignment

请考虑以下代码:

#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。我得到的输出是:

int:4的对齐方式 是'我'对齐:真实的 移动指针4个字节
'p'是否对齐:真实

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

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

修改

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

第二次编辑

注意链接已更新,不再出现可能的问题。

1 个答案:

答案 0 :(得分:2)

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

虽然它在标准中说:

  

该函数更新其ptr和space参数,以便可以重复调用它   可能是同一缓冲区的不同对齐和大小参数

我不确定这是什么意思,或者它是否相关。我认为不是。