ページ 11

異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月25日(水) 11:00
by 菅沢
こんにちは
大きな概念問題と思いますが。
考えても分らないので、皆さんにお願いします。
二つのC言語object内に同じタイプの構造体を持つとします。
もしこの二つのC言語objectが異なるALIGNMENT SWITCH のもとで生成されたら、
この二つのobjectの関数間で構造体をCOPYして渡す行為は正常にならない場合もあり得ますね?

よろしくお願いします

Re: 異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月25日(水) 11:05
by beatle
C言語の用語では,「オブジェクト」は変数などのデータ記憶域を表すのですが,「object」をその意味で使っていますか?
それとも,もしかして「オブジェクトファイル」のことを「object」と書いていますか?

Re: 異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月25日(水) 11:20
by 菅沢
beatle さんが書きました:C言語の用語では,「オブジェクト」は変数などのデータ記憶域を表すのですが,「object」をその意味で使っていますか?
それとも,もしかして「オブジェクトファイル」のことを「object」と書いていますか?
ごめんなさい!
ここでいう「object」とは「オブジェクトファイル」のことです。

宜しくお願いします

Re: 異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月25日(水) 11:25
by beatle
考えても分からないなら,実際にテストコードを書いて実験してみれば良いと思うのですが,いかがでしょうか.
例えば

コード:

struct Hoge { ... } __attribute__ ((packed));
struct Hoge f(void) { ... }

コード:

struct Hoge { ... };
void g(struct Hoge h) { ... }
int main(void)
{
    g(f());
    return 0;
}
という2つの.cファイルを作り,それぞれコンパイルしてリンクすればいいんじゃないでしょうか.

(__attribute__ ((packed))はgcc専用の命令です)

Re: 異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月26日(木) 09:06
by 菅沢
ご返答ありがとうございます。
いまgcc という環境はないんで、すぐ実験できませんが
もしMSのVC環境でやろうとしたら
「__attribute__ ((packed))」を何に置き換えば良いのでしょうか。

それから、もし結果が正常であれば、どう解釈すればよろしいでしょうか。
私はCを勉強中で、結果はどうでもいいですが、知りたいのは「理屈」です。

Re: 異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月26日(木) 09:23
by softya(ソフト屋)
菅沢 さんが書きました:いまgcc という環境はないんで、すぐ実験できませんが
もしMSのVC環境でやろうとしたら
「__attribute__ ((packed))」を何に置き換えば良いのでしょうか。
前回の質問で私がアライメント変更方法は回答済みです。

「アラインメントの効果は本当? • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=10069#p81188
菅沢 さんが書きました:それから、もし結果が正常であれば、どう解釈すればよろしいでしょうか。
私はCを勉強中で、結果はどうでもいいですが、知りたいのは「理屈」です。
アライメントが違うデータを混ぜた構造体で前回のような構造体の場合、アライメントのためのパディングが必要になるので構造体の大きさが違ってきますからコピーしても絶対正しくコピーできません。
理屈は、隙間(パティング)があるからとしか言えません。

「データ型のアラインメントとは何か,なぜ必要なのか?」
http://www5d.biglobe.ne.jp/~noocyte/Pro ... nment.html

理屈もいいですが自分の目で確認しないと大きな勘違いをしているかも知れませんよ。
理論と実践は理解のために絶対必要な行為です。

Re: 異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月26日(木) 09:52
by 菅沢
良く分かりました。
感謝の気持ちいっぱいです。
=====================================================================================================
環境依存ですが、VC++の場合
#pragma pack(1)
でアライメントを変更可能ですので、そちらを使って同じ形の構造体を使って比較した方が良いと思います。
=====================================================================================================
これですね。

ご紹介ぐださったページはいい勉強にりました。
(昨日2時間かけて読みました----完全に分ったかどうか分りませんが)

これからも宜しくお願い致します。

Re: 異なるALIGNMENT SWITCH のもとで生成されたObject

Posted: 2012年1月26日(木) 16:43
by ISLe
メンバのオフセットアドレスが違えば、ドット演算子やアロー演算子で正しくメンバを参照することもできませんよ。