memcpy and other functionsが処理できるバッファの最大サイズはいくらですか?この実装は依存していますか?これは引数として渡されるサイズ(size_t)によって制限されますか?memcpy/memsetなどで扱えるバッファの最大サイズはいくらですか?
答えて
これは完全に実装に依存します。
これはハードウェアによって異なりますが、コンパイラの年齢によっても異なります。合理的に現代的なコンパイラ(90年代初頭以降の標準に基づく何かを意味する)を持つ人にとっては、size引数はsize_t
です。コンパイラがコンパイルするメモリモデルに応じて、最大16ビットの符号なし、最大の32ビットの符号なし、または最大64ビットの符号なしとすることができます。この場合、あなたの実装にはどれくらいのサイズのsize_t
があるかを調べるだけです。ただし、非常に古いコンパイラ(つまり、ANSI-Cおよびperhaps for some early versions of ANSI Cの前)では、すべてのベットがオフです。
例えば、標準の側では、cygwinとSolaris 7を見ると、size引数はsize_t
です。私が利用できる組み込みシステムを見ると、size引数はunsigned
(16ビットの符号なしを意味する)です。 (この組み込みシステム用のコンパイラは80年代に書かれました)ANSI C where the size parameter is an int
のWeb参照が見つかりました。
あなたはsize_t
が誤って署名されたいくつかの初期のGCCのバージョンの誤機能についてsize_t
上this articleなどfollow-up articleを見てみたいことがあります。要約すると
は、ほぼ全員ため、size_t
は、使用する正しい参照となります。しかし、非常に古いコンパイラを使用している組み込みシステムやレガシーシステムを使用しているシステムでは、マニュアルページを確認する必要があります。
これらはsize_t引数をとります。プラットフォームに依存しています。
実装に依存しますが、memcpyを使用する前にインクルードする必要があるヘッダー(.h)ファイルを見ることができます。宣言があなたに伝えます(size_tか他のものを探す)。
そして、あなたはsize_tがどのようなものかを尋ねる、それは実装依存の部分です。
関数は通常、パラメータとしてサイズを渡すためにsize_t
を使用します。 fgets()
はint
というパラメータを使用しているので、私は普通に言っています。これは私の意見ではC標準の欠陥です。
size_t
は、アクセス可能なオブジェクトのサイズ(バイト単位)を含むことができるタイプとして定義されています。一般的にはunsigned int
またはunsigned long
のtypedefです。
だから、sizeof
演算子による戻り値はsize_t
タイプです。
So 2 **(sizeof(size_t)
* CHAR_BIT
)は、プログラムで処理できる最大量のメモリを提供しますが、確かに最も正確なメモリではありません。
(CHAR_BIT
はlimits.h
で定義され、char
に含まれるビット数を生成します)。
CHAR_BITは8に定義されていませんか?または、charは1バイトにのみ定義されていますか? –
char = 1バイト、ビット数が変更される可能性があります – aib
標準を引用すると、CHAR_BITは「ビットフィールド(バイト)ではない最小オブジェクトのビット数」であり、少なくとも8でなければなりません。リンク:http://c-faq.com/charstring/wchar.html。 –
右、2 ^(sizeof(size_t)* 8)バイトを超える領域はコピーできません。しかし、これは心配するものではありません。なぜなら、malloc
もsize_tパラメータとしてサイズを取るため、スペースをさらに割り当てることができないからです。
"2 ^(sizeof(size_t)* 8)"と思っています。 –
よくmalloc()を複数回呼び出すことができます:) – aib
@aibもちろん、連続したバッファは保証されません。 –
また、size_t
が、あなたのプラットフォームでプロセスが実際に処理することができるものを表すことができる問題に関連しています。
64ビットプラットフォームの仮想メモリであっても、今週は数TB以上のサイズのmemcpy()
を呼び出すことはできませんが、それでもかなりホットなマシンです。完全にカバーされた64ビットのアドレス空間をインストールすることが可能なマシンがどのようなものかは想像がつきません。
size_t
の定義にかかわらず、RAMよりも多くの情報をmemcpy()
より多く試すのは意味がありません。あなたがした場合、その呼び出しから返信アドレスを保持しているスタックにちょうど何が起こったのか考えますか?
またはプロセスによって認識される仮想アドレス空間が、インストールされている物理メモリよりも小さいシステム。これは実際にはWin64プラットフォーム上で実行されるWin32プロセスの場合です。 (私は最初に、4MBの物理メモリと64KBの仮想アドレスを持つPDP-11上で動作するOS TSX-11を共有する時に遭遇した.4MBのRAMは多くのメモリを消費していた。 )
- 1. 8086のセグメントの最大サイズと最小サイズはどれくらいですか?
- 2. ハッシュテーブルの最大サイズはどのくらいですか?
- 3. 東京キャビネットの最大サイズはどのくらいですか?
- 4. webRTCデータチャネルメッセージの最大サイズはどれくらいですか?
- 5. SockJSメッセージの最大サイズはどれくらいですか?
- 6. memcachedの最大鍵長と最大サイズはどれくらいですか?
- 7. junit perameterizedテストで扱える最大パラメータ数はいくつですか?
- 8. C++とjavaのマップオブジェクトの最大サイズはいくらですか?
- 9. EWSのItemViewの最大サイズはいくらですか?
- 10. UINavigationBar titleViewの最大サイズはいくらですか?
- 11. PHPで扱える最大の数字は何ですか?
- 12. Azure VMのMSSQL Server用ディスクの最大サイズはどれくらいですか?
- 13. Google Guavaキャッシュのデフォルトの最大サイズはどれくらいですか?
- 14. iPhone/Androidアプリのログファイルの最大サイズはどれくらいですか?
- 15. 現代GPUのテクスチャメモリの最大サイズはどれくらいですか?
- 16. HSQL DBのテーブル名の最大サイズはどれくらいですか?
- 17. Sidekiqジョブペイロードの推奨最大サイズはどれくらいですか?
- 18. cassandra cqlsh_historyとcli.historyの最大サイズ/行数はどれくらいですか?
- 19. ローカルフロート配列の最大許容サイズはどれくらいですか?
- 20. 紺碧の簡単なテーブルの最大サイズはいくらですか?
- 21. sqliteでnvarcharに与えることができる最大サイズはいくらですか?
- 22. ジャクソンが扱うJsonの最大サイズ
- 23. クラスファイルの最適サイズはどれくらいですか?
- 24. Androidアプリの最適サイズはどれくらいですか?
- 25. ブラウザのURLの最大長はどのくらいですか?
- 26. codeigniterの最大URI長はどのくらいですか?
- 27. Chromecastメッセージの最大スループットはどのくらいですか?
- 28. loadrunnerのパラメータの最大長はどれくらいですか?
- 29. xmlhttprequestレベル2の最大ファイルアップロードサイズはどのくらいですか?
- 30. elasticsearchのキーワードタイプの最大長はどれくらいですか?
誰もが、これをあまり標準化していないときに、C言語でプログラミングするには十分ではなかったはずです。 – Eddie
C89以前のコンパイラは依然として共通ですか?レガシーシステムでの作業を除いて、size_tに依存するのはかなり安全だと思います。 –
私はあなたがこのsize_tのことはよく標準化されていないと言われていたので、私は落ちました。 –