アカウント名:
パスワード:
コメントされた方の多くはCとC++とを高級言語として比較されているようですが、高級アセンブラの代替としてCを使っていらっしゃる方はもういないのでしょうか?例えばC++における構造体(=クラス)のコンパイル後の記憶イメージの配置がビット単位である程度保障できるようなオプションを持つコンパイラってあるんですか?
# 他のオブジェクトがRTTIを利用したりすると何も変更がなくても影響を受けそうで。
「ビット単位で」と修飾されるとビットフィールドも含むことになると思いますが、ビットフィールドほど自由にならない機能もないですね。MSBから埋めるかLSBから埋めるか、環境によって違うし、ビット単位での配置が重要な場合はまず使いません。バイト単位ならある程度コントロールできますけど。
そんなわけで、ハードウエアデバイスのレジスター定義にビットフィールドを使っているソースを見ると、これを書いたやつは何を考えていたんだと問い詰めたくなりますね。
ビット演算ができない自称 C プログラマもいたりするので苦肉の策だったのでは...と思いたい。
> C++における構造体(=クラス)
クラスのように使えるよう拡張されているとはいえ、C++の構造体(struct)はクラス(class)と(いちおう)別です。
> 記憶イメージの配置がビット単位である程度保障できるような> オプションを持つコンパイラ
structならCで#pragmaやオプションで制御できる程度には、C++でも制御できると思います。
ただ、自分でアセンブラ代替として細かい操作を行う場合は、バイトオーダとかパディングの呪いを極力避けるために、CだろうがC++だろうがバイトストリームとして実装します。
特に外部装置(通信路や外付けハード、バス制御)とのやり取りの部分については。
そこまで気を使う必要が無いところは、C++でもCでも同様に書きますし...
structはクラスじゃない?省略時のアクセス制御が違うだけで。C++STD20039 ClassesL4 A structure is a class defined with the class-key struct;its members and base classes (clause 10) are public by default (clause 11).
何の説明してるんだろう。C++におけるstructとclassの違いはメンバのデフォルトスコープだけですよ。つまりstruct{...}=class{public: ...}。そしてclassであってもPOD型 [wikipedia.org]はCと互換がありますよ。じゃなきゃCとC++で共用できるヘッダファイルが書けませんて。# もちろんCにはclassがないからstructで書くことになるけど。
ていうことがわかっていれば、C++を高級アセンブラとして使えるかと。
POD Typeであればそうなんですけど、RTTIやtemplateによる型派生の関係で勝手にvirtual tableが追加されてPODでなくなるってことはないんでしょうか?
#1567512 [srad.jp] の人の答え通りなのですが、ついでに書くと、 RTTI の仕様も POD type に vtable を追加しないで済むようになっています。例えば、 dynamic_cast は原則として仮想関数を持つ構造体・クラスに対してしか使えないことになっています。
C++も超高級変態アセンブラという認識しかありません。だからメモリ弄りまくりか過去の資産などで使わざるをえない用途以外は他の真っ当な言語を使います。
実際ファームなんかの小さいの書いていると、C++の変態さが足を引っ張る事がある。そういう用途ではまだまだCの方がマシだ。実行環境でOSが面倒を見てくれるものであればC++とかもっと高級なオブジェクトげ指向言語でも良いが、自分で全部面倒を見なきゃいけない環境では情報が遮蔽されるのはちょっとマズイ。ま、実際は未だにそういう用途ではコンパイラの出力したアセンブリコードを触ることも有る位だし。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家
高級アセンブラの代替としてのC (スコア:1)
コメントされた方の多くはCとC++とを高級言語として比較されているようですが、
高級アセンブラの代替としてCを使っていらっしゃる方はもういないのでしょうか?
例えばC++における構造体(=クラス)のコンパイル後の記憶イメージの配置が
ビット単位である程度保障できるようなオプションを持つコンパイラってあるんですか?
# 他のオブジェクトがRTTIを利用したりすると何も変更がなくても影響を受けそうで。
Re:高級アセンブラの代替としてのC (スコア:2)
「ビット単位で」と修飾されるとビットフィールドも含むことになると思いますが、ビットフィールドほど自由にならない機能もないですね。MSBから埋めるかLSBから埋めるか、環境によって違うし、ビット単位での配置が重要な場合はまず使いません。バイト単位ならある程度コントロールできますけど。
そんなわけで、ハードウエアデバイスのレジスター定義にビットフィールドを使っているソースを見ると、これを書いたやつは何を考えていたんだと問い詰めたくなりますね。
Re: (スコア:0)
ビット演算ができない自称 C プログラマもいたりするので苦肉の策だったのでは...
と思いたい。
Re: (スコア:0)
> C++における構造体(=クラス)
クラスのように使えるよう拡張されているとはいえ、
C++の構造体(struct)はクラス(class)と(いちおう)別です。
> 記憶イメージの配置がビット単位である程度保障できるような
> オプションを持つコンパイラ
structならCで#pragmaやオプションで制御できる程度には、
C++でも制御できると思います。
ただ、自分でアセンブラ代替として細かい操作を行う場合は、
バイトオーダとかパディングの呪いを極力避けるために、
CだろうがC++だろうがバイトストリームとして実装します。
特に外部装置(通信路や外付けハード、バス制御)との
やり取りの部分については。
そこまで気を使う必要が無いところは、C++でもCでも同様に書きますし...
struct is class (スコア:2)
structはクラスじゃない?省略時のアクセス制御が違うだけで。
C++STD2003
9 Classes
L4 A structure is a class defined with the class-key struct;
its members and base classes (clause 10) are public by default (clause 11).
Re:高級アセンブラの代替としてのC (スコア:1)
何の説明してるんだろう。
C++におけるstructとclassの違いはメンバのデフォルトスコープだけですよ。つまりstruct{...}=class{public: ...}。そしてclassであってもPOD型 [wikipedia.org]はCと互換がありますよ。じゃなきゃCとC++で共用できるヘッダファイルが書けませんて。
# もちろんCにはclassがないからstructで書くことになるけど。
ていうことがわかっていれば、C++を高級アセンブラとして使えるかと。
Re:高級アセンブラの代替としてのC (スコア:1)
POD Typeであればそうなんですけど、RTTIやtemplateによる型派生の関係で
勝手にvirtual tableが追加されてPODでなくなるってことはないんでしょうか?
Re:高級アセンブラの代替としてのC (スコア:2)
#1567512 [srad.jp] の人の答え通りなのですが、ついでに書くと、 RTTI の仕様も POD type に vtable を追加しないで済むようになっています。例えば、 dynamic_cast は原則として仮想関数を持つ構造体・クラスに対してしか使えないことになっています。
Re: (スコア:0)
最初期のC++言語仕様の段階でRTTIが導入されていた筈です。
vfptrが云々と言うからには、おそらく暗黙のうちに全てのクラスが
タイプ情報クラスを継承するようにコンパイルされてしまう、という様な
事を想定してるんだと思いますが、そういう事はユーザー自身でやってね、
っていうのがC++の哲学ですよ。
templateに関してはコンパイル時に全て型情報を処理してしまうので、
実行時に型情報を持ち込むような事はありませんし、もし持ち込む様な
事があれば、それはtemplateとは言いません。
Re: (スコア:0)
C++も超高級変態アセンブラという認識しかありません。だからメモリ弄りまくりか過去の資産などで使わざるをえない用途以外は他の真っ当な言語を使います。
Re: (スコア:0)
実際ファームなんかの小さいの書いていると、C++の変態さが足を引っ張る事がある。
そういう用途ではまだまだCの方がマシだ。
実行環境でOSが面倒を見てくれるものであればC++とかもっと高級なオブジェクトげ指向言語でも良いが、
自分で全部面倒を見なきゃいけない環境では情報が遮蔽されるのはちょっとマズイ。
ま、実際は未だにそういう用途ではコンパイラの出力したアセンブリコードを触ることも有る位だし。