考虑以下代码:
#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
是 'i' 对齐的:true
移动的指针 4 个字节
是 'p' 对齐的:true
指示指针已移动,即使地址已正确对齐。但是,文档(http://en.cppreference.com/w/cpp/memory/align)说它“......修改ptr以指向这种对齐存储的第一个可能地址......”但不会这意味着指针应该保持不变?
所以我的问题是:如果参数指针已经对齐,std::align (指针)的第三个参数是否总是会更改为大一号?
编辑
此外,如果指针未更改,那么http://www.cplusplus.com/reference/memory/align/?kw=align中的示例不会进入无限循环吗?
第二次编辑
注意 链接已更新,可能的问题不再出现。