
No.3ベストアンサー
- 回答日時:
他の回答は読みました。
そのうえで。unsafeモードにした時点で、そこはCの世界です。
ポインタアクセスと配列アクセスについても同様で、
ただ1つの要素にアクセスするだけなら処理速度に差はないでしょうが、
forループで回し続けたりすれば、indexerを見るよりもポインタアクセスのほうが速いでしょう。
また、indexerの値チェックはされません(これもCと同じ)。
>unsafeモードにした時点で、そこはCの世界です。
明快な回答、ありがとうございます。
となると、
>forループで回し続けたりすれば、indexerを見るよりもポインタアクセスのほうが速いでしょう。
が理解できなくなりました。
byte* pp = (byte*)Buffer;
byte[] buf = (byte []) Buffer;
for(int i=0; i<n; i++) {
pp[i]=i;
}
for(int i=0; i<n; i++) {
buf[i]=i;
}
は全く同じコードに翻訳されると思うのですが・・・
No.4
- 回答日時:
>for(int i=0; i<n; i++) {
> pp[i]=i;
>}
>for(int i=0; i<n; i++) {
> buf[i]=i;
>}
>は全く同じコードに翻訳されると思うのですが・・・
そりゃ同じでしょう。
処理速度の違いは定義じゃなくアクセスの仕方によります。
逆に
for(int i=0; i<n; i++, pp++) {
*pp=i;
}
for(int i=0; i<n; i++, buf++) {
*buf=i;
}
も、pp, bufの定義に関係なく速度は同じでしょう。
繰り返しますが、処理速度の違いは定義じゃなくアクセスの仕方によります。
>繰り返しますが、処理速度の違いは定義じゃなくアクセスの仕方によります。
つまり
bufとppでは同じ
アクセスの違いとしてbuf[i]と*buf では、*bufのほうが速い(場合がある)
ということですね。
今回の
>pp[i], buf[i] で同じデータにアクセスできると思うのですが、違いはどこにありますか?
>処理速度的に違いはあるのでしょうか?
の直接の回答ではなく、おまけ情報ですね。ちょっと混乱しましたが、回答の意味、理解できました。
ありがとうございました。
No.2
- 回答日時:
>エッ? どちらも参照も代入もできますけど?
恐らくポインタの意味自体を理解されていませんね。
ポインタというのはそのデータの格納されているメモリのアドレスを引き渡す機能です。
一方配列というのは言語による違いはありますがC#の場合、配列の長さ、データを格納する領域、及び、チェックロジックから成立しています。
ポインタはその場所を参照に必要なデータをもっているのに対し、配列はデータそのものが代入されています。
ポインタの場合は先頭のアドレスのみを受け渡せばよい為、パフォーマンス面では有利です。
一方でポインタの場合、予約された領域外にもアクセスできてしまいバグの原因になるばかりか、最悪の場合突然OSにプロセスKillされる事になります。
C#の場合ref(参照渡し)や、readonly ref(参照読み取り専用渡し)と言う事が可能です。
refを利用する事で、ポインタの様なパフォーマンスの良さと配列の予約外の領域へのアクセスを未然に防げるという両方が可能になります。
readonly refを利用する事で、refの利点に加えて、値渡しの様に予期せぬ元データの書き換え阻止ができます。
C#2.0まではパフォーマンスの都合でどうしてもポインタを使わざるおえないところがありました。
ですが今のC#では適切な参照渡しを行えばポインタと同程度に高速で、ポインタを使った場合よりも安全なソースコードを記述することができます。
代替機能の完成度が高く、ポインタを使っても碌な事になりません。
unsafeのキーワードが出てきた時点で何かおかしな事をしようとしていると思ってください。
回答ありがとうございます
>恐らくポインタの意味自体を理解されていませんね。
説明いただいた内容はすべて承知しています。その上での質問です。
>unsafeのキーワードが出てきた時点で何かおかしな事をしようとしていると思ってください。
「添え字チェックを省略する」というある意味「おかしな事」を実現しようとするプログラムですが、それは作者が意図したことです。
繰り返しになりますが質問では、
unsafeモードで配列とポインタの違い
です。
配列の場合、unsafeモードにしても、添え字チェックが行われるということでしょうか?
作者の意図とおり、添え字チェックが行われないのであれば、ポインタとの違いはどこにあるのでしょうか?
C言語のように、ポインタと配列は同一と思ってよいのでしょうか?
という質問です。
よろしくお願いします。
<おまけ>
以下のことを理解したうえで作成されたプログラムです。
for(int i = 0; i < a.Length; i++)
{
a[i] = i; // これは添え字チェックされない
}
for(int i = 0; i < n; i++)
{
a[i] = i; // これは添え字チェックされる
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) findメソッドの変数について 6 2023/06/23 08:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
init関数の意味
-
ポインタについて
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
Run-Time Check Failure #3とい...
-
トリプルポインタが必須!とな...
-
popenした子プロセスのプロセス...
-
va_listを使用したfscanf()関数...
-
基本アルゴリズムの『返す』の...
-
関数ポインタの利点
-
fopne で失敗する原因
-
C言語習得のレベル.
-
メモリのアドレスからの値の取...
-
C++で関数ポインタから関数名を...
-
アプリを32bitから64bit移行
-
#define NULL ((void *)0) の弊害
-
構造体の中の構造体
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
PASCALとFARの意味
-
LPSTR型の初期化について
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
プーさんのマウスポインタを教...
-
連結リスト 要素の入れ替え
-
ハンドルはポインタか
-
C++で関数ポインタから関数名を...
-
自作DLLの引数について、ポイン...
-
NULLポインタが0でない処理系と...
-
TCHAR文字列内の検索について
おすすめ情報