确定C/C++结构中元素对齐的算法

Cla*_*hes 0 c++ algorithm alignment

好了,请允许我再次问这个问题,因为一切答案在什么我真正感兴趣的(道歉,如果像这样的问题的整体规模的编辑是一个人造PAUS)获得.

几点:

  • 这是使用与我正在测试的编译器不同的编译器的离线分析,因此SIZEOF()或类似的东西不能用于我正在做的事情.
  • 我知道它是实现定义的,但我碰巧知道我感兴趣的实现,如下所示.

让我们创建一个名为pack的函数,它将一个整数(称为alignment)和一个整数元组(称为元素)作为输入.它输出另一个整数,称为大小.

该功能的工作原理如下:

int pack (int alignment, int[] elements)
{
  total_size = 0;

  foreach( element in elements )
  {
    while( total_size % min(alignment, element) != 0 ) { ++total_size; }
    total_size += element;
  }

  while( total_size % packing != 0 ) { ++total_size; }

  return total_size;
}
Run Code Online (Sandbox Code Playgroud)

我想我要问的是,但我不知道是否反转是正确的说法"这是什么函数的反函数?" - 我不记得曾经处理的多输入功能倒置,所以我可能只是使用不适用的术语.

像我想要的东西(有点像)存在; 这里我提供了一个我们称之为determine_align的函数的伪代码.但是,这个函数有点幼稚,因为它只是用不同的输入一遍又一遍地调用pack,直到得到它预期的答案(或失败).

int determine_align(int total_size, int[] elements)
{
  for(packing = 1,2,4,...,64) // expected answers.
  {
    size_at_cur_packing = pack(packing, elements);

    if(actual_size == size_at_cur_packing)
    {
      return packing;
    }
  }

  return unknown;
}
Run Code Online (Sandbox Code Playgroud)

所以问题是,是否有更好的Determ_align实现?

谢谢,

Pav*_*aev 7

C/C++中结构成员的对齐完全是实现定义的.那里有一些保证,但我不明白他们会如何帮助你.

因此,没有通用的方法来做你想要的.在特定实现的上下文中,您应该参考该实现的文档(如果已涵盖).


CB *_*ley 5

当选择如何将成员打包到struct实现中时,不必遵循您在算法中描述的那种方案,尽管它是常见的方案.(即对齐的最小尺寸类型和首选的机器对齐尺寸.)

但是,您不必比较a的总大小struct来确定已应用于单个struct成员的填充.标准宏offsetof将从struct任何单个struct成员的开头给出字节偏移量.