std:align() は既に割り当てたアドレスのアラインメントを取る関数です。
まあ自前の関数やマクロでアラインメントを取るのも不可能じゃないと思いますが C++ プログラマーはそういうのは自分で実装しないほうが良いという姿勢でいくべきだと思うんで std::align() を使うほうが正攻法だと思います。
以下が宣言となります。
#include <memory> void* align( std::size_t alignment, std::size_t size, void*& ptr, std::size_t& space );
ちょっと紛らわしいですが memory ヘッダーをインクルードします。
そしてちょっと使ってアラインメントが取れるから確認してみましょうかね。
main.cpp.
1 #include <memory> 2 #include <cstdio> 3 #include <cstdint> 4 5 int main() 6 { 7 char data[1024]; 8 void *ptr = data; 9 std::size_t size = 1024; 10 std::printf("alignof: %d\n",(int)alignof(char)); 11 std::align(32,sizeof(char),ptr,size); 12 std::printf("32 bit alignment : %p\n",ptr); 13 std::align(256,sizeof(char),ptr,size); 14 std::printf("256 bit alignment: %p\n",ptr); 15 16 return 0; 17 }
ビルドと実行結果.
$ g++ main.cpp $ ./a.out alignof: 1 32 bit alignment : 0x7ffdd5ec0e20 256 bit alignment: 0x7ffdd5ec0f00
結果は 32 ビットのほうは「0x7ffdd5ec0e20」となりたぶん取れています。
256 ビットについては「0x7ffdd5ec0f00」となり下 2 桁が 0 なのでアラインメントは確認できます。
Copyright 2018-2019, by Masaki Komatsu