std:: align
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<memory>
|
||
|
void
*
align
(
std::
size_t
alignment,
std::
size_t
size,
|
(C++11부터) | |
주어진 포인터 ptr 에서 크기 space 의 버퍼를 가리킬 때, 지정된 alignment 로 정렬된 size 바이트 수에 대한 포인터를 반환하고 정렬에 사용된 바이트 수만큼 space 인수를 감소시킵니다. 첫 번째 정렬된 주소가 반환됩니다.
이 함수는 버퍼에 주어진 정렬(alignment)로 원하는 바이트 수를 맞출 수 있을 경우에만 포인터를 수정합니다. 버퍼가 너무 작으면 함수는 아무 작업도 수행하지 않고 nullptr 을 반환합니다.
동작은 alignment 가 2의 거듭제곱이 아닌 경우 정의되지 않습니다.
목차 |
매개변수
| alignment | - | 원하는 정렬 |
| size | - | 정렬할 저장소의 크기 |
| ptr | - |
최소
space
바이트 이상의 연속 저장소(버퍼)에 대한 포인터
|
| space | - | 작업을 수행할 버퍼의 크기 |
반환값
조정된 ptr 값, 또는 제공된 공간이 너무 작을 경우 널 포인터 값.
예제
서로 다른 타입의 객체를 메모리에 배치하기 위해
std::align
사용법을 보여줍니다.
#include <iostream> #include <memory> #include <new> template<std::size_t N> struct MyAllocator { std::byte data[N]; std::size_t sz{N}; void* p{data}; MyAllocator() = default; // Note: only well-defined for implicit-lifetime types template<typename T> T* implicit_aligned_alloc(std::size_t a = alignof(T)) { if (std::align(a, sizeof(T), p, sz)) { T* result = std::launder(reinterpret_cast<T*>(p)); p = static_cast<std::byte*>(p) + sizeof(T); sz -= sizeof(T); return result; } return nullptr; } }; int main() { MyAllocator<64> a; std::cout << "allocated a.data at " << (void*)a.data << " (" << sizeof a.data << " bytes)\n"; // Allocate a char if (char* p = a.implicit_aligned_alloc<char>()) { *p = 'a'; std::cout << "allocated a char at " << (void*)p << '\n'; } // Allocate an int if (int* p = a.implicit_aligned_alloc<int>()) { *p = 1; std::cout << "allocated an int at " << (void*)p << '\n'; } // Allocate an int, aligned at a 32-byte boundary if (int* p = a.implicit_aligned_alloc<int>(32)) { *p = 2; std::cout << "allocated an int at " << (void*)p << " (32-byte alignment)\n"; } }
가능한 출력:
allocated a.data at 0x7ffc654e8530 (64 bytes) allocated a char at 0x7ffc654e8530 allocated an int at 0x7ffc654e8534 allocated an int at 0x7ffc654e8540 (32-byte alignment)
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2377 | C++11 |
alignment
이 기본 정렬 값 또는 지원되는 확장 정렬 값이어야 함
|
2의 거듭제곱이기만 하면 됨 |
참고 항목
alignof
(C++11)
|
타입의 정렬 요구 사항을 조회
(연산자) |
alignas
(C++11)
|
변수의 저장 공간이 특정 크기로 정렬되도록 지정
(지정자) |
|
(C++11부터)
(C++23에서 사용 중단)
|
주어진 크기의 타입들을 위한 초기화되지 않은 저장 공간으로 사용하기 적합한 타입을 정의
(클래스 템플릿) |
|
(C++20)
|
컴파일러에게 포인터가 정렬되어 있음을 알림
(함수 템플릿) |