問題タブ [memcpy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
637 参照

c++ - テンプレートを使用したC++パケットビルダー

PacketBuilderは、char*配列への書き込みを可能にする小さなクラスです。追加機能:

エラーなしでコンパイルします。Appendを呼び出し、Tをunsigned short(WORD)として使用する場合。それは素晴らしい働きをします。Tをunsignedcharとして使用する場合。リンカーエラーが発生します。

VS2010からのエラー(ドイツ語vs2010を取得しました):

エラーLNK2019:VerweisaufnichtaufgelöstesexternesSymbol"" public:void __thiscall PacketBuilder :: Append(unsigned char) "(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)" in Funktion "" public:void __thiscall Client: :DoHandshake(void) "(?DoHandshake @ Client @@ QAEXXZ)"。1> C:\ XXX \ C ++ \ SilkroadEmu \ Debug \ LoginServer.exe:致命的なエラーLNK1120:1nichtaufgelösteexterneVerweise。

英語に翻訳:

エラーLNK2019:未解決の外部シンボル "" public:void __thiscall PacketBuilder :: Append(unsigned char) "(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)" in Function "" public:void __thiscall Client :: DoHandshake( void) "(?DoHandshake @ Client @@ QAEXXZ)"。1> C:\ XXX \ C ++ \ SilkroadEmu \ Debug \ LoginServer.exe:致命的なエラーLNK1120:1つの未解決の外部シンボル。

0 投票する
1 に答える
3799 参照

c++ - gcc の小さい、または固定サイズのデータ​​用に最適化された memcpy

memcpy を使用して、可変サイズのデータ​​と固定サイズのデータ​​の両方をコピーします。場合によっては、少量のメモリ (ほんの数バイト) をコピーします。GCCでは、memcpyが組み込み/組み込みであったことを思い出します。ただし、(valgrind を使用して) コードをプロファイリングすると、glibc で実際の「memcpy」関数が何千回も呼び出されます。

組み込み関数を使用するには、どのような条件を満たす必要がありますか? 私は自分の memcpy をすばやくロールバックできますが、ビルトインは私ができることよりも効率的であると確信しています。

注: ほとんどの場合、コピーされるデータの量は、コンパイル時の定数として利用できます。

CXXFLAGS: -O3 -DNDEBUG

私が現在使用しているコードでは、ビルトインを強制しています。_ builtinプレフィックスを外すと、ビルトインは使用されません。これは、T=sizeof(type) を使用して他のさまざまなテンプレート/関数から呼び出されます。使用されるサイズは、1、2、4 の倍数、いくつかの 50 ~ 100 バイト サイズ、およびいくつかのより大きな構造です。

0 投票する
3 に答える
3662 参照

c - Cマクロで記述された変数のアドレスを取得するには?

私は C が初めてで、いくつかのマクロ ステートメントを試しています。次のような行があります。

そして、後の関数で、別のメモリ ゾーンmemcpyにコピーするために使用したいと思います。VALUEこのような:

渡される VALUE は、あらゆる種類のデータにすることができます。そのため、void* を使用してそれを指し、memcpy を使用してサイズのバイト数をコピーしています。

しかし、もちろんうまくいきません:)

これは私が関数を呼び出す方法です:

GCCは私にこれを与えます:

エラー: 左辺値は単項 '&' として必要です オペランド

コピーにアドレスを使用できるようにするために、マクロに渡される変数のアドレスを見つける方法を知っている人はいますか?

マクロの後半部分は変更できます (「write_implement」とパラメーターは変更できますが、「write_data」パラメーターは変更できません)。また、実装部分も自由に変更できます。

0 投票する
4 に答える
9542 参照

c - 整数値を char バッファにコピーする memcpy()

int のメモリ値を char バッファにコピーしようとしています。コードは次のようになります。

str1 を印刷すると空白になります。どうか明らかにしてください。

0 投票する
8 に答える
41178 参照

c - memcpyのパフォーマンスを向上させる方法

概要:

memcpyは、実際のアプリケーションまたはテストアプリケーションのシステムで2GB/秒を超えて転送できないようです。メモリ間のコピーを高速化するにはどうすればよいですか?

全詳細:

データキャプチャアプリケーションの一部として(いくつかの特殊なハードウェアを使用)、一時バッファからメインメモリに約3GB/秒をコピーする必要があります。データを取得するために、ハードウェアドライバーに一連のバッファー(各2MB)を提供します。ハードウェアはデータを各バッファにDMAし、各バッファがいっぱいになるとプログラムに通知します。私のプログラムはバッファを空にし(memcpyを別のより大きなRAMブロックに)、処理されたバッファをカードに再ポストして再度埋めます。memcpyがデータを十分に速く移動することに問題があります。メモリからメモリへのコピーは、実行しているハードウェアで3GB/秒をサポートするのに十分な速度である必要があるようです。Lavalys EVERESTは、9337MB /秒のメモリコピーベンチマーク結果を提供しますが、単純なテストプログラムであっても、memcpyではこれらの速度に近づくことはできません。

バッファ処理コード内のmemcpy呼び出しを追加/削除することで、パフォーマンスの問題を切り分けました。memcpyがなくても、約3GB/秒のフルデータレートで実行できます。memcpyを有効にすると、約550Mb /秒に制限されます(現在のコンパイラを使用)。

私のシステムでmemcpyのベンチマークを行うために、データのいくつかのブロックでmemcpyを呼び出すだけの別のテストプログラムを作成しました。(以下のコードを投稿しました)これは、使用しているコンパイラ/ IDE(National Instruments CVI)とVisual Studio2010の両方で実行しました。現在VisualStudioを使用していませんが、喜んで使用します。必要なパフォーマンスが得られる場合は、切り替えを行います。しかし、やみくもに移動する前に、それが私のmemcpyパフォーマンスの問題を解決することを確認したかったのです。

Visual C ++ 2010:1900MB/秒

NI CVI 2009:550MB/秒

CVIがVisualStudioよりも大幅に遅いことに驚いていませんが、memcpyのパフォーマンスがこれほど低いことに驚いています。これが直接比較できるかどうかはわかりませんが、これはEVERESTベンチマーク帯域幅よりもはるかに低くなっています。そのレベルのパフォーマンスは必要ありませんが、最低3GB/秒が必要です。確かに、標準ライブラリの実装は、エベレストが使用しているものよりもはるかに悪くなることはありません!

この状況でmemcpyを高速化するために、もしあれば、何ができますか?


ハードウェアの詳細:AMDMagnyCours-4xオクタルコア128GBDDR3 Windows Server 2003 Enterprise X64

テストプログラム:

編集:余分な5分があり、貢献したい場合は、上記のコードをマシンで実行して、コメントとして時間を投稿できますか?

0 投票する
11 に答える
183858 参照

c - memcpy() と memmove()

memcpy()との違いを理解しようとしていますが、重複するソースと宛先を処理しないmemmove()テキストを読みました。memcpy()memmove()

ただし、重複するメモリ ブロックでこれら 2 つの関数を実行すると、どちらも同じ結果になります。たとえば、memmove()ヘルプ ページにある次の MSDN の例を見てください。

の欠点とmemcpyそれをどのようmemmoveに解決するかを理解するためのより良い例はありますか?

出力:

0 投票する
2 に答える
3205 参照

c++ - memcpy のコンパイラ エラー、パラメータ 2 を MyStruct1 から const void* に変換できません

ある構造から別の構造にデータをコピーしようとしています。各構造体が処理できるバイトは同じです。私の宣言と memcpy は次のとおりです。

ここで、最初の構造体 Data1 にデータがあり、2 番目の構造体が宣言されたとします。

次のコードを使用しています。

エラーが出てコンパイルできません。何か案は?データをコピーする他の方法はありますか?

0 投票する
3 に答える
1556 参照

c++ - Memcpy() 関数の使い方

代わりに、最後に memcpy を使用したい

memcpy の使用中にエラーが発生しました

src/coder.c:909: エラー: バイナリへのオペランドが無効です * ('unsigned int' と 'int **' があります)
src/coder.c:910: エラー: バイナリへのオペランドが無効です * ('unsigned int' と'int **')

memcpy を正しく使用するにはどうすればよいですか?

0 投票する
7 に答える
6478 参照

c - Linux デバイス ドライバー: シンボル "memcpy" が見つかりません

Linux デバイス ドライバーを作成しようとしています。「memcpy」を使用しようとするまでは、非常にうまく機能していました。「make」すると、警告が表示されるだけで、コンパイラエラーは発生しません。

WARNING: "memcpy" [/root/homedir/sv/main.ko] undefined!

OK、insmod 経由でロードしようとすると、コンソールが表示されます。

insmod: error inserting './main.ko': -1 Unknown symbol in module

そしてdmesgで:

main: Unknown symbol memcpy (err 0)

私は以下を含めます:

memcpy を使用する関数:

誰かが私を助けることができますか?linux/string.h にあると思っていましたが、同じエラーが発生します。私はカーネル 2.6.37-rc1 を使用しています (2.6.37-rc1 以降でのみ動作する user-mode-linux で実行しています)。どんな助けでも大歓迎です。

0 投票する
6 に答える
42783 参照

c - strncpyとmemcpyの違いは?

s[7]にアクセスするにはどうすればよいsですか?

strncpyと の間に違いは見られませんでしたmemcpy。output を(like )sとともに出力したい場合、次のコードでどのような変更を加える必要がありますか。s[7]qwertyA

出力: