問題タブ [pass-by-pointer]
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.
perl - これらのコード ブロックの動作が異なるのはなぜですか?
私は Perl を初めて使用するので、これを理解できません。2 つの一見同一のコード セットがありますが、1 つのサブルーチンが値を更新し、別のサブルーチンは値を更新しません。最初のコード セットでは、配列への参照が渡され、その参照が指している値が更新されると理解しています。その後、サブルーチンを終了すると、値が変更されています。ただし、2番目のものでは、同じことが起こると予想されます。配列は更新されますが、サブルーチンを終了すると忘れてしまいます。2 番目のコード セットの舞台裏で何が起こっているのか説明してもらえますか?
最初のコード セット:
2 番目のコード セット:
c++ - ポインター渡しの代わりに参照渡しを使用する場合のバイナリ互換性
この質問は、次の質問に対するフォローアップの質問として意図されています: C++ におけるポインター変数と参照変数の違いは何ですか?
回答とstackoverflowで見つけたいくつかのさらなる議論を読んだことで、コンパイラは参照渡しをポインタ渡しと同じように扱うべきであり、参照は構文糖に過ぎないことがわかりました。バイナリ互換性を考慮して違いがあるかどうか、まだ把握できていないことが 1 つあります。
私たちの (マルチプラットフォーム) フレームワークでは、リリース ビルドとデバッグ ビルドの間 (およびフレームワークの異なるリリース間) でバイナリ互換性を保つ必要があります。特に、デバッグ モードでビルドするバイナリは、リリース ビルドで使用できる必要があり、その逆も同様です。これを実現するために、インターフェイスでは純粋な抽象クラスと POD のみを使用します。
次のコードを検討してください。
ISerializer
IException
また、純粋な抽象クラスでもあります。ISerializer
既存のオブジェクトを指す必要があるため、常に NULL ポインター チェックを実行する必要があります。IException
ポインターが指すアドレスを変更する必要がある、ある種の例外処理を実装します。このため、ポインタからポインタへのポインタを使用しますが、NULL ポインタもチェックする必要があります。
コードをより明確にし、不要な実行時チェックを取り除くために、参照渡しを使用してこのコードを書き直します。
これで問題なく動作するようです。しかし、これが依然としてバイナリ互換性の要件を満たしているかどうかという疑問が残ります。
更新: 物事を明確にするために:この質問は、コードのポインター渡しバージョンと参照渡しバージョンの間のバイナリ互換性に関するものではありません。これがバイナリ互換でないことはわかっています。実際、バイナリの互換性を気にせずに、ポインター渡しではなく参照渡しを使用することを検討している API を再設計する機会があります (新しいメジャー リリース)。問題は、コードの参照渡しバージョンのみを使用する場合のバイナリ互換性についてです。
c++ - オブジェクトを関数に渡すときにすべての操作を表示するには、どの演算子をオーバーロードする必要がありますか?
オブジェクトを関数に渡すときにオブジェクトに対して行われるすべてのコピー/割り当て/削除などの操作を示すコードを書きたいと思います。
私はこれを書きました:
私は何かを忘れましたか?オブジェクトを渡すさまざまな方法を比較するときに、他に考慮すべきことはありますか?
c++ - C ++でオンザフライで定義された組み込み型へのポインターを渡す
ライブラリの関数を呼び出したい(変更できない)
int
とをその場で定義する関数を呼び出す方法はありchar
ますか?
つまり、次のようなことをしています
それ以外の
これにより、コードの長さが大幅に短縮され、読みやすさが向上します。
c - 整数/構造体配列の終わり?
基本的に、main() はどのようにしてトラバースするバイト数、つまり alloco() 関数によって割り当てられたメモリを知るようになるのでしょうか。文字配列に NULL のような区切り文字はありますか?
c++ - C++ 参照による呼び出し
整数へのポインターを受け取る関数があり、メインから整数変数への参照を渡す場合、これは値による呼び出しですか、それとも参照による呼び出しですか? サンプルコード:
上記のコードで、関数funの呼び出しは、値による呼び出しですか、それとも参照による呼び出しですか?
c++ - ベクトルのベクトルを関数に渡す
私は受け入れる機能を持っています
MyClass インスタンスを変更します。C++ を書いてから長い時間が経ちましたが、ここで引数全体を値ではなく参照で渡すのに十分なものを思い出すのに苦労しています。
私の元のメソッド署名は次のとおりです。
このメモリを効率的にしたいので、もともとこれを次のように変更しました。
その後、これは私の vec 値がすべての内部ベクトルのコピーを作成することを意味することに気付きました。そこで、関数の署名を次のように変更しました。
これで十分ですか、それとも次のようなこともする必要がありますか?
誰かがこれらすべてのメモリの違いを強調できますか? どうもありがとう!
c++ - ポインタなしで参照渡しを実装できますか?
これは C++ 自体よりもコンピューター アーキテクチャに関する問題かもしれませんが、C++ のような言語でポインターを使用せずに理論的に参照渡しを実装できるかどうか疑問に思っていました。
以下に、同様の機能と構造を持つコードの例を 3 つ示します。
私の推測では、最初のバージョンのインクリメント関数は、ポインターなしでグローバル変数に直接アクセスします。2 番目のバージョンは、ローカル変数を指す関数のスタック フレームにポインターを割り当て、間接的にアクセスします。クイック検索から、3 番目のバージョンは 2 番目のバージョンとまったく同じように (とにかく最適化する前に) 実装されているようです。出典:リファレンスは内部でどのように実装されていますか?
しかし、理論上(または実際には、コンパイラによる最適化後)、3 番目の関数は、ポインターなしで独自のスタック フレーム外のローカル変数に直接アクセスできますか? それとも、メモリ内の場所が静的であるため、その動作はグローバル変数に限定されますか?
ポインターの作成と逆参照には、少しの時間とメモリが必要だと思うので、これを尋ねます。十数回の参照を渡す深い再帰関数などでは、その時間とメモリが加算される可能性があります。
PS インライン関数についても具体的に言及する必要があります。これらの関数は新しいスタック フレームを生成することすらありません。つまり、バージョン 2 と 3 のアセンブリ コードは、関数がinline int increment(int*)
との場合に異なりますinline int increment(int&)
か? または、その場合、コンパイラはポインターを最適化して削除しますか?
c - このポインタ渡しが意図したとおりに機能しないのはなぜですか?
次のコードが機能しない理由を理解しようとしています...助けてください:
出力は次のとおりです。
私は期待しています: ff99a348,1 ff99a348,2 ff99a348,2
ポインターについて知っていることはすべて壊れています...
ありがとう。
編集:
主な質問は、 incme((double *)&i); でキャストされた型について尋ねています。double にキャストして関数に渡さないのはなぜですか? ... eailer を指摘せずに申し訳ありません ....
c++ - C++ のパラメーターとして、スマート ポインターよりもスマート ポインターの参照を優先する必要があるのはなぜですか?
私は現在、ポインターの参照を多用するコード(c ++ 11)に取り組んでいます。
これで(Visual Studio 2013 VC12を使用して)パフォーマンスをテストしましたが、時間に違いはないようです。Null-Ptr を渡しても問題ありません。
では、この場合に参照を使用する理由として考えられるものは何でしょうか?