我有一个想要与给定对齐方式对齐的值,即如果它尚未对齐,则将该值增加到对齐的下一个倍数。
在 C++ 中执行此操作的简洁方法是什么?
例如
int x;
int alignment;
int y = ???; // align x to alignment
可以说对齐是a
---(k-1)a-----------x--------------ka---------
<----r----><-----(a-r)--->
其中k
是一个整数(ka
对齐的倍数也是如此)
先找余数
r = x%a
然后将 x 递增到下一个倍数
y = x + (a-r)
但是如果 r = 0,那么 y = x
所以最后
r = x%a;
y = r? x + (a - r) : x;
如果对齐是 2 的幂,并且机器对负数使用 2 的补码,则:
mask = alignment - 1;
aligned_val = unaligned_val + (-unaligned_val & mask);
从我的片段库:
template <typename I=size_t>
inline I IntAlign( I sz, I step=16, I min=16 ) {
auto s = std::max(sz+step-1,min);
return s - s%step;
}
数学很简单,所以......这是测试代码的一个片段:
TEST(Sz,Basic) {
EXPECT_EQ( 16U, IntAlign(0U) );
EXPECT_EQ( 16U, IntAlign(1U) );
EXPECT_EQ( 8U, IntAlign(5U,8U,8U) );
EXPECT_EQ( 8U, IntAlign(7U,8U,8U) );
EXPECT_EQ( 64U, IntAlign(7U,8U,64U) );
EXPECT_EQ( 16, IntAlign(0) );
EXPECT_EQ( 16, IntAlign(1) );
EXPECT_EQ( 8, IntAlign(8,8,8) );
EXPECT_EQ( 8, IntAlign(7,8,8) );
EXPECT_EQ( 64, IntAlign(7,8,64) );
}
笔记!
从您的用例中添加测试并在需要时对其进行修复。没有任何保证!