9

我有一个想要与给定对齐方式对齐的值,即如果它尚未对齐,则将该值增加到对齐的下一个倍数。

在 C++ 中执行此操作的简洁方法是什么?

例如

int x;
int alignment;
int y = ???; // align x to alignment
4

3 回答 3

14

可以说对齐是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;
于 2012-10-04T06:56:58.390 回答
2

如果对齐是 2 的幂,并且机器对负数使用 2 的补码,则:

mask = alignment - 1;
aligned_val = unaligned_val + (-unaligned_val & mask);
于 2019-10-28T15:51:04.473 回答
0

从我的片段库:

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) );
}

笔记!
从您的用例中添加测试并在需要时对其进行修复。没有任何保证!

于 2020-09-27T10:22:05.480 回答