私は C とアセンブリの両方を学習中であり、const-correctness と実際に生成されたコードとの関係を理解したいと考えています。
私の質問は、以下にあるこの関数を考えると、最も効率的なコードを生成するために、コンパイラーに可能な限り多くのヒントを与えるにはどうすればよいかということです。
void hdlc_tx_frame(const void* const buffer, uint8_t bytes_to_send)
{
uint8_t data;
uint8_t* tmp_buffer = buffer;
// Start marker
data = HDLC_FLAG_SEQUENCE;
hdlc_tx_byte(&data);
// Send escaped data
while(bytes_to_send)
{
// Get next data
data = *(tmp_buffer++);
// See if data should be escaped
if((data == HDLC_CONTROL_ESCAPE) || (data == HDLC_FLAG_SEQUENCE))
{
uint8_t tmp = HDLC_CONTROL_ESCAPE;
hdlc_tx_byte(&tmp);
data ^= HDLC_ESCAPE_BIT;
}
// Send data
hdlc_tx_byte(&data);
// decrement counter
bytes_to_send--;
}
// End marker
data = HDLC_FLAG_SEQUENCE;
hdlc_tx_byte(&data);
}
いかなる方法でもhdlc_tx_byte(&data)
変更されないことに注意してください。data
buffer
const への const ポインターとして宣言してから、単純に const へのポインターとしてtmp_buffer
残すよりも、変数を作成する努力をしていますか?buffer
それが const へのポインターであることを宣言することは、実際には何らかの方法で役立ちますか?
bytes_to_send を非 const として宣言すると、単に関数のローカル コピーが作成されますか?これは、const を呼び出して別の一時カウンター変数を作成するよりも優れた形式ですか?
この質問が一般的すぎる場合は、お詫び申し上げます。他の場所でこの種のものを検索するたびに、構文の可能性を教えてくれるサイトを見つけますが、それ以上のものはありません。