プロが教える店舗&オフィスのセキュリティ対策術

次のようなプログラムをよく見ます。

void method(char* strOrg) {
char str[SIZE + 1] = {""};
memcpy(str, strOrg, SIZE);
}


これって、どうせ最後のヌルだけ残るので
次のようにした方が、パフォーマンスがよく
上記より良いプログラムだと思うのですか、
どうなのでしょうか?

void method(char* strOrg) {
char str[SIZE + 1];
memcpy(str, strOrg, SIZE);
str[SIZE] = '\0';
}

A 回答 (2件)

あなたが提示された条件での前提であるなら、


最後にNULLを設定したほうが良いでしょう。
memcpy,strcpy等の文字列操作関数は文字列が長い場合、CPUの使用率に大きな影響を与えます。
SIZEが小さい場合は、気にする必要はありませんが、今回のような癖をつけておくことは非常に大切なことです。
特に、常駐プログラムを作成する場合は、CPU使用率が高くなると、他のプロセスに影響を与えるので、特に留意すべきです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>>memcpy,strcpy等の文字列操作関数は文字列が長い場合、CPUの使用率に大きな影響を与えます。

現場のベテランと同じこと言ってますね。

お礼日時:2016/11/05 01:05

○最適化まで考えたときにどちらが効率よくなるかは不明です。



○「文字列のコピー」なら、strcpy (出力先の大きさを考慮するならstrncpy) の方が良いでしょう。
 このmemcpyだと必ずSIZEだけコピーします。
 strncpyなら、文字列長だけしかコピーしません。
 method("HELLO") 等とした場合、memcpyでは、 "HELLO"の領域を越えて読みにいこうとします。領域外へのアクセスは何が起こるかわかりません。
 strncpyなら、領域を越えることはしません。

○「SIZEバイトのバイナリデータのコピー」なら、SIZE+1 で宣言することも str[SIZE]=0 にすることも無意味に思えます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>最適化まで考えたときにどちらが効率よくなるかは不明です。
それは、SIZEが1GBくらいでも不明なのでしょうか?

お礼日時:2016/11/05 01:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!