タグ付けされた質問 「object-lifetime」

2
このオブジェクトの有効期限を延長するクロージャーはC#コンパイラのバグですか?
私がいくつかの極端に遭遇したとき、私はオブジェクトのライフタイムを(合法的に)延長する可能性についての質問に答えていましたC#コンパイラーの奇妙なコード生成(問題の場合は4.0。 私が見つけることができる最も短い再現は次のとおりです: staticを呼び出しているときにローカルをキャプチャするラムダを作成する 包含型のメソッド。 生成されたデリゲート参照を、それを含むオブジェクトのインスタンスフィールドに割り当てます。 結果:コンパイラーは、理由がない場合にラムダを作成したオブジェクトを参照するクロージャーオブジェクトを作成します。デリゲートの「内部」ターゲットは静的メソッドであり、ラムダ作成オブジェクトのインスタンスメンバーは不要です。デリゲートが実行されたときに触れられる(されない)。事実上、コンパイラーは、プログラマーがthis理由なしに取り込んだように機能します。 class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } } リリースビルドから生成されたコード(「より単純な」C#に逆コンパイル)は、次のようになります。 public void InstanceMethod() { <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1(); CS$<>8__locals2.<>4__this = this; // What's …

3
const参照によってデフォルトの引数の値を返すことは問題ありませんか?
以下の例のようにconst参照によってデフォルトの引数の値を返すことは問題ありませんか? https://coliru.stacked-crooked.com/a/ff76e060a007723b #include <string> const std::string& foo(const std::string& s = std::string("")) { return s; } int main() { const std::string& s1 = foo(); std::string s2 = foo(); const std::string& s3 = foo("s"); std::string s4 = foo("s"); }


2
タイプ・パンニング・テーマのバリエーション:インプレース・トリビアル・コンストラクション
これはかなり一般的なテーマであることは知っていますが、典型的なUBを見つけるのは簡単ですが、今のところこの亜種は見つかりませんでした。 そこで、実際のデータのコピーを避けながら、Pixelオブジェクトを正式に紹介しようとしています。 これは有効ですか? struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v<Pixel>); Pixel* promote(std::byte* data, std::size_t count) { Pixel * const result = reinterpret_cast<Pixel*>(data); while (count-- > 0) { new (data) Pixel{ std::to_integer<uint8_t>(data[0]), std::to_integer<uint8_t>(data[1]), std::to_integer<uint8_t>(data[2]), std::to_integer<uint8_t>(data[3]) }; data += sizeof(Pixel); } return result; // throw in …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.