std :: optional- {}またはstd :: nulloptで空を構築しますか?

35
Drew Dormann 2019-09-17 10:48.

私は初期化すると思った https://en.cppreference.com/w/cpp/utility/optionalhttps://en.cppreference.com/w/cpp/utility/optional/nullopt デフォルトの構造と同じになります。

https://en.cppreference.com/w/cpp/utility/optional/optional、フォーム(1)として

ただし、ClangとGCCはどちらも、これらのおもちゃの例の機能を異なる方法で処理しているようです。

#include <optional>

struct Data {
    char large_data[0x10000];
};

std::optional<Data> nullopt_init() {
  return std::nullopt;
}

std::optional<Data> default_init() {
  return {};
}

https://godbolt.org/z/mDeDZQを使用std::nulloptすると、単に「含む」フラグが設定されます。

nullopt_init():
    mov     BYTE PTR [rdi+65536], 0
    mov     rax, rdi
    ret

デフォルトの構築では、クラス全体が初期化されます。これは機能的には同等ですが、ほとんどの場合コストがかかります。

default_init():
    sub     rsp, 8
    mov     edx, 65537
    xor     esi, esi
    call    memset
    add     rsp, 8
    ret

これは意図的な行動ですか?あるフォームが他のフォームよりも優先されるのはいつですか?

3 answers

21
T.C. 2019-09-17 10:55.

この場合、{}値の初期化を呼び出します。場合optionalのデフォルトコンストラクタは、ユーザ提供ない招く全体オブジェクトの初期化をゼロにすることを、(ここで、おおよそ『ではないユーザが提供する』手段『は、暗黙的に宣言的または明示的クラス定義内にデフォルトされます』)。

そうするかどうかは、その特定のstd::optional実装の実装の詳細によって異なります。libstdc ++optionalのデフォルトのコンストラクターはユーザー提供ではないように見えますが、libc ++のデフォルトコンストラクターはユーザー提供です。

11
Marc Glisse 2019-09-28 07:34.

gccの場合、デフォルトの初期化による不要なゼロ化

std::optional<Data> default_init() {
  std::optional<Data> o;
  return o;
}

です https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86173コンパイラ自体で修正する必要があります。同じlibstdc ++を使用して、clangはここでmemsetを実行しません。

コードでは、実際にはオブジェクトの値を初期化しています(リストの初期化を使用)。std :: optionalのライブラリ実装には2つの主なオプションがあるようです:=default;libstdc ++のようにデフォルトのコンストラクター(書き込み、1つの基本クラスが値がないことを示すフラグの初期化を処理します)をデフォルトにするか、デフォルトのコンストラクターを定義します、libc ++のように。

現在、ほとんどの場合、コンストラクターのデフォルト設定が適切です。これは、些細なこと、constexpr、または可能な場合はnoexceptであり、デフォルトの初期化などで不要なものを初期化することを回避します。これは、ユーザー定義のコンストラクターがの言語の癖のおかげで、利点 http://eel.is/c++draft/dcl.init#8.1.2、およびデフォルト設定の通常の利点は適用されません(constexprとnoexceptを明示的に指定できます)。クラスタイプのオブジェクトの値の初期化は、オブジェクト全体をゼロで初期化することから始まります。デフォルトのコンストラクターがユーザー提供(またはその他の技術的な場合)でない限り、コンストラクターが重要な場合はコンストラクターを実行します。これは不幸な仕様のように思えますが、この時点で修正する(サブオブジェクトを調べてゼロ初期化するものを決定する)のは危険な場合があります。

https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=bafd12cb22e83b7da8946873513a897e48e2900f、libstdc ++は、std :: nulloptと同じコードを生成する使用済み定義のコンストラクターバージョンに切り替えました。それまでの間、実用的には、コードを複雑にしないstd :: nulloptのコンストラクターを使用することをお勧めします。

3
Rin Kaenbyou 2019-09-29 11:35.

この標準では、これら2つのコンストラクターの実装については何も述べていません。[optional.ctor]によると:

constexpr optional() noexcept;
constexpr optional(nullopt_t) noexcept;
  1. 保証:*this値が含まれていません。
  2. 備考:含まれている値は初期化されません。すべてのオブジェクトタイプについて、Tこれらのコンストラクターはconstexprコンストラクター(9.1.5)でなければなりません。

これは、これら2つのコンストラクターの署名とそれらの「Ensures」(別名エフェクト)を指定するだけoptionalです。これらのコンストラクターのいずれの後でも、には値が含まれていません。その他の保証はありません。

最初のコンストラクターがユーザー定義であるかどうかは、実装定義です(つまり、コンパイラーによって異なります)。

最初のコンストラクターがユーザー定義の場合は、もちろんcontainsフラグを設定することで実装できます。ただし、ユーザー定義ではないコンストラクターも(gccによって実装される)標準に準拠していfalseます。これは、フラグをにゼロ初期化するためです。コストのかかるゼロ初期化になりますが、標準で指定されている「保証」に違反しません。

実際の使用法に関して言えば、最適なコードを作成するために実装を掘り下げたのは素晴らしいことです。

補足として、おそらく標準では、これら2つのコンストラクター(つまり、O(1)またはO(sizeof(T)))の複雑さを指定する必要があります。

Related questions

MORE COOL STUFF

ダイアナ妃は、8歳でウィリアム王子を寄宿学校に送るという決定に「涙を流した」

ダイアナ妃は、8歳でウィリアム王子を寄宿学校に送るという決定に「涙を流した」

ウィリアム王子が 8 歳のときに寄宿学校に通わせたことについて、ダイアナ妃がどのように感じたかを学びましょう。

シャキール・オニールは、レイカーズのスターが彼のチキン帝国を北テキサスに拡大するにつれて、ダラスの外に永住権を購入しました

シャキール・オニールは、レイカーズのスターが彼のチキン帝国を北テキサスに拡大するにつれて、ダラスの外に永住権を購入しました

Shaquille O'Neal は最近、Big Chicken レストラン帝国を拡大するため、ダラス郊外に住居を購入しました。

「90 日間の婚約者」: イヴが逮捕され、浮気スキャンダルの後、モハメドに対する家庭内暴力の容疑に直面している — 何が起こったのか?

「90 日間の婚約者」: イヴが逮捕され、浮気スキャンダルの後、モハメドに対する家庭内暴力の容疑に直面している — 何が起こったのか?

「90日の婚約者」シーズン9のスター、イヴ・アレラーノが逮捕され、モハメド・アブデルハメドへの暴行容疑で家庭内暴力の罪に問われている.

ナターシャ・リオンは、ピーウィー・ハーマンは「ビジネスで最高のGIFを送る」と言います

ナターシャ・リオンは、ピーウィー・ハーマンは「ビジネスで最高のGIFを送る」と言います

ナターシャ・リオンは、ピーウィー・ハーマン自身、ポール・ルーベンスと親密です。彼らの友情について彼女が言ったことを発見してください。

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ニューヨーク州ブルックリン、住居侵入により91歳の死者、彼の「激しい」100歳の妻が動揺

ニューヨーク州ブルックリン、住居侵入により91歳の死者、彼の「激しい」100歳の妻が動揺

ワディマンとエスリン・トンプソン(@OneRandom_Chick via Twitterスクリーンショット)「ドナルド・トランプ、スティーブ・バノン、そして 『em』ファイルで地獄の内輪に特別な場所があります」、ニューヨーク州ブルックリンの高齢者

アイスランドは、プロバイダーが望んでいないネオナチのウェブサイトであるデイリーストーマーの未来を考えています

アイスランドは、プロバイダーが望んでいないネオナチのウェブサイトであるデイリーストーマーの未来を考えています

ネオナチのウェブサイトTheDailyStormerの編集者であるAndrewAnglinが、8月にバージニア州シャーロットビルで白人の超常主義者にひかれた後に亡くなった女性を侮辱して以来、さまざまなドメインプロバイダーからウェブサイトを別の場所に移動するように言われました。地点。現在、アイスランドはドメインWebサイトを立ち上げるかどうかを検討しています。

Fortniteはそれを粉砕し続けます

Fortniteはそれを粉砕し続けます

先週末、漫画風のバトルロワイヤルゲームFortniteは、すべてのプラットフォームで340万人の同時ユーザーを襲いました。

ウォッチ:ラシダジョーンズは#MeTooとTime'sUpは包括的でなければならないと言います

ウォッチ:ラシダジョーンズは#MeTooとTime'sUpは包括的でなければならないと言います

月曜日のMakersConferenceでAvaDuVernayが司会を務めたパネルディスカッションで、ハリウッドの女性が#MeTooムーブメントとTime'sUpイニシアチブについて話し合いました。パネルは映画とテレビ業界の女性とTime'sUpイニシアチブで構成されました:ディレクターMelina Matsoukas、弁護士ニーナ・ショー、作家兼コメディアンのジル・ソロウェイ、エージェントのマハ・ダキル、俳優のナタリー・ポートマンとラシダ・ジョーンズ。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

水門の修理

水門の修理

天王星と海王星の間の領域に向かって宇宙を 3/4 g の低温で航行しながら、私たちは数週間燃え続けていました。Dawson Trawler の科学者が Yggdrasil ポータルと呼んだもの。

美しいもの

美しいもの

女性として、私は通常、関係を築くことをためらっています。私はいつも彼らに負けないように苦労しました。私は誰かと共有したいという衝動と戦わなければなりません。

逃走中の女性からの発信

最も家が必要なときに家のように感じる場所はありません。

逃走中の女性からの発信

私は誰よりも移動しました。父が住んでいた土地には、父が 1 歳馬を折るミニチュアの競馬場がありました。

死にゆく男から学んだ最大の人生の教訓

彼は、私たちが持っているのはこの現在の瞬間だけであることを知るのが遅すぎました。

死にゆく男から学んだ最大の人生の教訓

ブラッドは、カーキ色のショート パンツとポロ シャツを着たまま、白いゴルフ グローブを両手で高く引っ張ったまま、ベッドルームに入ってきました。彼は満面の笑みを浮かべながら、「今年は私の人生で最高の年だったと思います!」と言いました。通常は保守的な消費者である私たちは、通常とは異なることをしました。

Language