エラー、バグ、質問 - ページ 2498

 
Andrei Trukhanovich:

その場合、イミフですが、そうすべきではないでしょう。

なぜ、ここでのサイズは4の倍数であってはいけないのでしょうか?

授業も整列できることがわかった。

 
fxsaber:

なぜ、ここでのサイズは4の倍数であってはいけないのでしょうか?

授業も整列できることがわかった。

次の外部変数は、構造体の大き さに関係なく、8で配置される可能性が高いです。

 
Andrei Trukhanovich:

内部アライメントであるため

そうすると、アライメントの意味がなくなってしまうので

struct A pack(4)
{
  short j;
};

void OnStart()
{
  Print(sizeof(A)); // 2
  
  const int handle = FileOpen(__FILE__, FILE_WRITE | FILE_BIN);
  
  if (handle != INVALID_HANDLE)
  {
    A a = {0};
    
    FileWriteStruct(handle, a);
    Print(FileTell(handle)); // 2
    
    FileClose(handle);
  }
}
 
fxsaber:

そうすると、アライメントの意味がなくなってしまうので

アライメントのポイントは、内部変数のアドレスがアライメントの倍数になるようにすることです。

 
Andrei Trukhanovich:

アライメントのポイントは、内部変数のアドレスがアライメントの倍数になるようにすることです。

あなたの発言とDocumentationを 比較してみましたが、やはり理解できません。

 
Andrei Trukhanovich:

無垢のもの、らしいです。ここには明らかにもう間違いがある。

struct A pack(4)
{
  short j;
};

void OnStart()
{
   A q[2];
   Print(sizeof(q)); // 4
   return;
}
 
fxsaber:

あなたの発言とDocumentationを 比較してみたが、よくわからない。

ヘルプが更新されていないのだと思います。つまり、C#をサポートしたビルド(冬頃?)では、アライメントがどのように動作するようになったかの説明があったのです。

hobberのアライメントに関する記事をググってみたんですが、MT5でも同じように使えると思います。https://habr.com/ru/post/142662/

 
Igor Makanu:

ヘルプが更新されていないようです、C#をサポートしたビルドでは(冬頃?)アライメントの動作の説明があったようですが、今はどうなっているのでしょうか?

hobberのこの記事でアライメントについてググってみましたが、現在MT5でも同じように動作するようですhttps://habr.com/ru/post/142662/

記事とそれに対するコメントを読みました。アライメントアルゴリズムが全く理解できない。pack(4)に設定されていますが、なぜか何かが2に、何かが4に整列しています。

 
fxsaber:

記事とそれに対するコメントを流しました。アライメントアルゴリズムが全く理解できない。pack(4)なのですが、なぜか何かが2、何かが4と揃うのです。

なぜ悩むのか?デフォルトのシングルアライメントは以前と同じ(変更する可能性も低い)、パック指定は曲がっている。どうしても必要な場合は、自分でアドオンを挿入することも可能です。

 
Vict:

なぜ悩むのか?デフォルトのシングルアライメントは以前と同じ(そして変更する可能性は低い)、パック指定は曲がっている。どうしても必要な場合は、自分でアドオンを挿入することも可能です。

その真相に迫りたい。