私の個人的な好みはCです。理由は次のとおりです。
- コードのすべての行が何をしているのか(そしてコストも)知っています
- コードのすべての行が何をしているのか(そしてコスト)を知るのに十分なほどC ++をよく知りません
なぜ人々はこれを言うのですか?あなたはしませんあなたは、ASMの出力を確認しない限り、Cのすべての行が何をしているか知っています。同じことがC ++にも当てはまります。
たとえば、この無実のステートメントはどのasmを生成しますか。
a[i] = b[j] * c[k];
それはかなり無実に見えますが、gccベースのコンパイラは8ビットマイクロ用にこのasmを生成します
CLRF 0x1f, ACCESS
RLCF 0xfdb, W, ACCESS
ANDLW 0xfe
RLCF 0x1f, F, ACCESS
MOVWF 0x1e, ACCESS
MOVLW 0xf9
MOVF 0xfdb, W, ACCESS
ADDWF 0x1e, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfa
MOVF 0xfdb, W, ACCESS
ADDWFC 0x1f, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0xfee, 0x1c
NOP
MOVFF 0xfef, 0x1d
NOP
MOVLW 0x1
CLRF 0x1b, ACCESS
RLCF 0xfdb, W, ACCESS
ANDLW 0xfe
RLCF 0x1b, F, ACCESS
MOVWF 0x1a, ACCESS
MOVLW 0xfb
MOVF 0xfdb, W, ACCESS
ADDWF 0x1a, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfc
MOVF 0xfdb, W, ACCESS
ADDWFC 0x1b, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0xfee, 0x18
NOP
MOVFF 0xfef, 0x19
NOP
MOVFF 0x18, 0x8
NOP
MOVFF 0x19, 0x9
NOP
MOVFF 0x1c, 0xd
NOP
MOVFF 0x1d, 0xe
NOP
CALL 0x2142, 0
NOP
MOVFF 0x6, 0x16
NOP
MOVFF 0x7, 0x17
NOP
CLRF 0x15, ACCESS
RLCF 0xfdf, W, ACCESS
ANDLW 0xfe
RLCF 0x15, F, ACCESS
MOVWF 0x14, ACCESS
MOVLW 0xfd
MOVF 0xfdb, W, ACCESS
ADDWF 0x14, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfe
MOVF 0xfdb, W, ACCESS
ADDWFC 0x15, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0x16, 0xfee
NOP
MOVFF 0x17, 0xfed
NOP
生成される命令の数は、以下に大きく依存します。
- a、b、cのサイズ。
- それらのポインタがスタックに格納されているか、グローバルであるか
- i、j、およびkがスタック上にあるか、グローバルであるか
これは、プロセッサがCを処理するように設定されていない小さな組み込みの世界に特に当てはまります。したがって、常にasm出力を調べない限り、CとC ++は互いに同じくらい悪いというのが私の答えです。お互いに同じくらい良いです。
ヒューゴ