さて、私が本当に興味を持っていたものに答えが得られなかったので、質問を再質問させてください(このような質問の全体規模の編集が偽物である場合は申し訳ありません).
いくつかのポイント:
- これは、私がテストしているものとは異なるコンパイラを使用したオフライン分析であるため、SIZEOF() などは私が行っていることでは機能しません。
- 私はそれが実装定義であることを知っていますが、私が興味を持っている実装をたまたま知っています。
アライメントと呼ばれる整数と、要素と呼ばれる整数のタプルを入力として取る pack と呼ばれる関数を作成しましょう。サイズと呼ばれる別の整数を出力します。
この関数は次のように機能します。
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;
}
私が聞きたいのは、「この関数の逆関数は何ですか?」ということだと思いますが、逆関数という用語が正しいかどうかはわかりません。複数の入力を持つ関数の逆関数を扱った覚えがないので、当てはまらない用語を使用している可能性があります。
私が欲しいもの(のようなもの)が存在します。ここで、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;
}
問題は、determine_align のより良い実装があるかどうかです。
ありがとう、