2016-08-28 3 views
3

次のbit fieldサンプルコードはhereです。より良いストレージ効率を要求します。しかし、私はどのようにコンパイラがビットフィールドを処理するのだろうか?Cコンパイラはどのようにビットフィールドを扱うのですか?

私はCコンパイラHASからビット単位の操作のための追加の命令を生成すると思います。したがって、データサイズは小さくなりますが、コードサイズが大きくなります。

Cコンパイラをよく知っている人は、何か光を当てることができますか?

#include <stdio.h> 

// A space optimized representation of date 
struct date 
{ 
    // d has value between 1 and 31, so 5 bits 
    // are sufficient 
    unsigned int d: 5; 

    // m has value between 1 and 12, so 4 bits 
    // are sufficient 
    unsigned int m: 4; 

    unsigned int y; 
}; 

int main() 
{ 
    printf("Size of date is %d bytes\n", sizeof(struct date)); 
    struct date dt = {31, 12, 2014}; 
    printf("Date is %d/%d/%d", dt.d, dt.m, dt.y); 
    return 0; 
} 
+5

生成されたアセンブラを見て調べることができます。 –

+0

@OliverCharlesworth思い出してくれてありがとう。どのように私はそれを忘れることができます... – smwikipedia

+1

それはあなたのプラットフォーム(基本的なHWアーキテクチャ+指定コンパイラ)によって異なりますが、一般的に - はい、コンパイラは、ビット単位の操作を追加する必要があります(通常、またはより遅いランタイム実行)。 –

答えて

5

データサイズが縮小されているがため、コードサイズが大きくなります。

通常、これは正しいです。よりコンパクトなストレージとより高速なアクセスのトレードオフです。

例えば、これは私のコンパイラはビットフィールドの例ではprintf文に生成するものである:

movq [email protected](%rip), %rax 
    movzwl (%rax), %edx 
    movl %edx, %esi 
    andl $31, %esi  ; -- extract the 5 bits representing day 
    shrl $5, %edx  ; -+ extract the four bits for the month 
    andl $15, %edx  ;/
    movl 4(%rax), %ecx ; -- year doesn't require any bit manipulation 
    leaq L_.str.1(%rip), %rdi 
    xorl %eax, %eax 
    callq _printf 

比較のために、同じコードdateは単純structのとき:

movq [email protected](%rip), %rax 
    movl (%rax), %esi ; -- day 
    movl 4(%rax), %edx ; -- month 
    movl 8(%rax), %ecx ; -- year 
    leaq L_.str.1(%rip), %rdi 
    xorl %eax, %eax 
    callq _printf 

すべてこれはもちろん、コンパイラやプラットフォーム固有のものです。

2

私が言うとおり、ビットフィールド用のドキュメントでは、これはコンパイラ用の
の推奨事項です。この実装は、実際のビットを選択するか、効率の悪い(空間的に)実装を行うためにフリーである
です。

ビットフィールドは実際にはビットを扱うための便利な構文です。

しかし組み込みコンパイラではビット付き作業は組み込みプログラミングでは非常に一般的な作業なので、実際のビットフィールドは
です。
もちろん、この機能を使用するには、
をコンパイラで文書化する必要があります。

アセンブラの複雑さに関しては、実際のビット
はアセンブラからもっと多くの作業が必要です。

+0

ありがとう。そして、はい、私は組み込みプログラミングを学んでいます。 – smwikipedia

関連する問題