std::align的使用问题
Usage Issue of std::align
考虑以下代码:
#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参数,以便可以用同一缓冲区
可能有不同的对齐方式和大小参数
我不确定这到底在说什么,或者它是否相关。我不这么认为。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- std::align的使用问题