C言語を勉強中です。
ネットで以下のような記述の資料がありました。
どういうことなのかわかりません。
ポインタについて理解しているつもりでいましたが、理解してなかったということのでしょうか。。。
なお、pがポインタとして宣言されているか、値として宣言されているかどうかについては記述がありませんでした。
これだけを見て、理解できる方がいれば、教えてもらえると助かります。
------------------------------------------------------------------------------
レイテンシの算出方法は、以下に示すアドレス更新処理を多数回実行することで行っている。
p = (char **)*p
レイテンシ時間=測定時間 / 実行回数 により算出される。
-------------------------------------------------------------------------------
No.1ベストアンサー
- 回答日時:
これ、ベンチマークテストかなんかのですかね?
・pに(char **)でキャストした内容を代入しているので、 char **pと予測される
・↑だとすると *P はchar *型になる。
・*pでpのアドレスからポインタ1つ分のデータ読み出す。
・↑はchar*型なので、char **にキャストしてpに代入する。→pが別のアドレスを示すようになる
・その「別のアドレス」からポインタ1つ分のデータ読み出す
...
とpの内容をメモリから「読み出して代入」を繰り返すもののようです。
お礼が遅れてすみません。
おっしゃる通り、ベンチマークテストに関する資料の記載内容です。
丁寧かつ簡潔に説明して頂き、ありがとうございます。
的を得ていて、非常にわかりやすいです。
pの宣言部分については、ご指摘の通り、恐らく、
char **p;
と宣言されているのだと思いました。
1つ質問がありまして、もしお時間おありでしたらご回答頂けると助かります。
質問内容は、p=(char**)*pをループ内で書くと、コンパイラの最適化機能によって、この処理が省かれてしまう可能性があるのではないか、ということです。
このままだと、pの値が変わらない気がします。
もしループさせる場合、インクリメント等によってpを更新する必要はあるでしょうか?
よろしくお願いします。
No.2
- 回答日時:
>1つ質問がありまして、もしお時間おありでしたらご回答頂けると助かります。
>質問内容は、p=(char**)*pをループ内で書くと、コンパイラの最適化機能によって、この処理が省かれてしまう可能性があるのではないか、ということです。
最適化される可能性は皆無です。
なぜなら「実行してみるまで、*pの値が判らない」からです。
p=(char **)*p;
は「pが指すアドレスのメモリからデータを取り出し、そのデータを新しいpの値とする」ので、pの値は「実行するたびに、何になるか判らない」です。
場合によっては「pが指すアドレスに読み出し可能なメモリがなく、メモリアクセス例外が発生するかも知れない」ですが、このベンチマークは「そんな事が起きるとは想定してない」と思います。
なるほどです。
よくわかりました。
貴重なお時間をご回答いただき、ありがとうございました。
どちらをベストアンサーにするか、非常に悩みます…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- 統計学 t検定を繰り返してはいけない理由について教えて下さい。 2 2022/05/15 12:37
- オープンソース IT用語、ソースとオブジェクト、改変と翻訳と翻案の違いなど どのようにりかいすればよいのですか 1 2022/09/09 10:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
strcat関数を自作したいです
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
2次元配列の文字"列"の初期化方法
-
csvファイルを構造体に格納した...
-
fgetc( )の戻り値はなぜ整数??
-
動的メモリの初期化方法について。
-
char 文字列型 の表現範囲が-12...
-
strcat関数
-
C言語でポインターで詰まってい...
-
char[]をDWORDに格納するには
-
共用体について
-
C言語の文字リテラル中の16進文...
-
szとlpszの違い
-
c言語でポインタ変数を用いた配...
-
文字列の演算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報