こんにちは
大きな概念問題と思いますが。
考えても分らないので、皆さんにお願いします。
二つのC言語object内に同じタイプの構造体を持つとします。
もしこの二つのC言語objectが異なるALIGNMENT SWITCH のもとで生成されたら、
この二つのobjectの関数間で構造体をCOPYして渡す行為は正常にならない場合もあり得ますね?
よろしくお願いします
異なるALIGNMENT SWITCH のもとで生成されたObject
Re: 異なるALIGNMENT SWITCH のもとで生成されたObject
C言語の用語では,「オブジェクト」は変数などのデータ記憶域を表すのですが,「object」をその意味で使っていますか?
それとも,もしかして「オブジェクトファイル」のことを「object」と書いていますか?
それとも,もしかして「オブジェクトファイル」のことを「object」と書いていますか?
-
菅沢
Re: 異なるALIGNMENT SWITCH のもとで生成されたObject
ごめんなさい!beatle さんが書きました:C言語の用語では,「オブジェクト」は変数などのデータ記憶域を表すのですが,「object」をその意味で使っていますか?
それとも,もしかして「オブジェクトファイル」のことを「object」と書いていますか?
ここでいう「object」とは「オブジェクトファイル」のことです。
宜しくお願いします
Re: 異なるALIGNMENT SWITCH のもとで生成されたObject
考えても分からないなら,実際にテストコードを書いて実験してみれば良いと思うのですが,いかがでしょうか.
例えば という2つの.cファイルを作り,それぞれコンパイルしてリンクすればいいんじゃないでしょうか.
(__attribute__ ((packed))はgcc専用の命令です)
例えば という2つの.cファイルを作り,それぞれコンパイルしてリンクすればいいんじゃないでしょうか.
(__attribute__ ((packed))はgcc専用の命令です)
-
菅沢
Re: 異なるALIGNMENT SWITCH のもとで生成されたObject
ご返答ありがとうございます。
いまgcc という環境はないんで、すぐ実験できませんが
もしMSのVC環境でやろうとしたら
「__attribute__ ((packed))」を何に置き換えば良いのでしょうか。
それから、もし結果が正常であれば、どう解釈すればよろしいでしょうか。
私はCを勉強中で、結果はどうでもいいですが、知りたいのは「理屈」です。
いまgcc という環境はないんで、すぐ実験できませんが
もしMSのVC環境でやろうとしたら
「__attribute__ ((packed))」を何に置き換えば良いのでしょうか。
それから、もし結果が正常であれば、どう解釈すればよろしいでしょうか。
私はCを勉強中で、結果はどうでもいいですが、知りたいのは「理屈」です。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 異なるALIGNMENT SWITCH のもとで生成されたObject
前回の質問で私がアライメント変更方法は回答済みです。菅沢 さんが書きました:いま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
理屈もいいですが自分の目で確認しないと大きな勘違いをしているかも知れませんよ。
理論と実践は理解のために絶対必要な行為です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
菅沢
Re: 異なるALIGNMENT SWITCH のもとで生成されたObject
良く分かりました。
感謝の気持ちいっぱいです。
=====================================================================================================
環境依存ですが、VC++の場合
#pragma pack(1)
でアライメントを変更可能ですので、そちらを使って同じ形の構造体を使って比較した方が良いと思います。
=====================================================================================================
これですね。
ご紹介ぐださったページはいい勉強にりました。
(昨日2時間かけて読みました----完全に分ったかどうか分りませんが)
これからも宜しくお願い致します。
感謝の気持ちいっぱいです。
=====================================================================================================
環境依存ですが、VC++の場合
#pragma pack(1)
でアライメントを変更可能ですので、そちらを使って同じ形の構造体を使って比較した方が良いと思います。
=====================================================================================================
これですね。
ご紹介ぐださったページはいい勉強にりました。
(昨日2時間かけて読みました----完全に分ったかどうか分りませんが)
これからも宜しくお願い致します。
Re: 異なるALIGNMENT SWITCH のもとで生成されたObject
メンバのオフセットアドレスが違えば、ドット演算子やアロー演算子で正しくメンバを参照することもできませんよ。