タグ付けされた質問 「strlen」

8
glibcのstrlenをすばやく実行するには、なぜ複雑にする必要があるのですか?
ここでstrlenコードを調べていて、コードで使用されている最適化が本当に必要かどうか疑問に思っていましたか?たとえば、次のようなものが同等以上に機能しないのはなぜですか? unsigned long strlen(char s[]) { unsigned long i; for (i = 0; s[i] != '\0'; i++) continue; return i; } より単純なコードは、コンパイラーが最適化するのに優れていたり、簡単だったりしませんか? strlenリンクの背後にあるページのコードは次のようになります。 /* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Torbjorn Granlund (tege@sics.se), with …


2
2次元配列のエイリアスを作成するときのstrlenの予期しない最適化
これが私のコードです: #include <string.h> #include <stdio.h> typedef char BUF[8]; typedef struct { BUF b[23]; } S; S s; int main() { int n; memcpy(&s, "1234567812345678", 17); n = strlen((char *)&s.b) / sizeof(BUF); printf("%d\n", n); n = strlen((char *)&s) / sizeof(BUF); printf("%d\n", n); } gcc 8.3.0または8.2.1を最適化レベル以外で使用すると-O0、0 2期待していたとおりに出力されます2 2。コンパイラは、strlenがに制限されb[0]ているため、除算される値と同じかそれ以上になることはないと判断しました。 これは私のコードのバグですか、コンパイラのバグですか? これは明確に規格に明記されていませんが、ポインターの来歴の主流の解釈は、どのオブジェクトXでも、コード(char *)&Xは全体を反復できるポインターを生成するべきだと思いましたX-この概念はXたまたま持っていても成り立つはずです内部構造としてのサブ配列。 (ボーナス質問、この特定の最適化をオフにするgccフラグはありますか?)

4
この関数が文字列の正しい長さを返すのはなぜですか?(charポインタのインクリメント)
これは文字列の文字数を数える関数です: int str_len(const char* s) { int i = 0; while(*(s++)) { i++; } return i; } なぜこれは正しい長さを返すのですか? この関数を単純なStringで呼び出すとしましょう"a"。次にs、whileループでインクリメントされるため、sおよびの値iは両方とも0です。
12 c  while-loop  strlen  c89 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.