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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
菅沢

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

#1

投稿記事 by 菅沢 » 14年前

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

よろしくお願いします

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#2

投稿記事 by beatle » 14年前

C言語の用語では,「オブジェクト」は変数などのデータ記憶域を表すのですが,「object」をその意味で使っていますか?
それとも,もしかして「オブジェクトファイル」のことを「object」と書いていますか?

菅沢

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

#3

投稿記事 by 菅沢 » 14年前

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

宜しくお願いします

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#4

投稿記事 by beatle » 14年前

考えても分からないなら,実際にテストコードを書いて実験してみれば良いと思うのですが,いかがでしょうか.
例えば

コード:

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

#5

投稿記事 by 菅沢 » 14年前

ご返答ありがとうございます。
いまgcc という環境はないんで、すぐ実験できませんが
もしMSのVC環境でやろうとしたら
「__attribute__ ((packed))」を何に置き換えば良いのでしょうか。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 14年前

菅沢 さんが書きました:いま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

#7

投稿記事 by 菅沢 » 14年前

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

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

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

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#8

投稿記事 by ISLe » 14年前

メンバのオフセットアドレスが違えば、ドット演算子やアロー演算子で正しくメンバを参照することもできませんよ。

閉鎖

“C言語何でも質問掲示板” へ戻る