Skip to content

Commit e9ded6b

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent 812bdd0 commit e9ded6b

File tree

5 files changed

+9190
-9146
lines changed

5 files changed

+9190
-9146
lines changed

reference/utility/observable_checkpoint.html

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,8 @@
188188

189189
<p class="text-right"><small>
190190
最終更新日時(UTC):
191-
<span itemprop="datePublished" content="2026-03-27T06:07:12">
192-
2026年03月27日 06時07分12秒
191+
<span itemprop="datePublished" content="2026-03-27T06:23:25">
192+
2026年03月27日 06時23分25秒
193193
</span>
194194
<br/>
195195
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -221,39 +221,39 @@
221221
<h2>概要</h2>
222222
<p>観測可能チェックポイント (observable checkpoint) を設置する。</p>
223223
<p>C++では<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>を含むプログラムに対して、コンパイラは<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>が「将来」発生することを根拠に、それより「前」の操作を削除・変更する最適化を行うことが許容される。これは「タイムトラベル最適化」と呼ばれる。</p>
224-
<p>例として以下のコードでは、(2)で<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>があるため、(1)の出力すら省略される可能性がある:</p>
224+
<p>例として以下のコードでは、nullポインタが渡された場合にエラーメッセージを出力してからデリファレンスに到達する意図だが、コンパイラは<code>++*p</code><a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>にならないと仮定して<code>p</code>がnullでないと推論し、<code>if(!p)</code>の分岐ごと削除できる。その結果、エラーメッセージが出力されることなくクラッシュする可能性がある:</p>
225225
<p><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../cstdio.html">&lt;cstdio&gt;</a></span>
226226

227-
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
228-
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">"Hello, "</span><span class="p">);</span><span class="w"> </span><span class="c1">// (1) 出力</span>
229-
<span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">nullptr</span><span class="p">;</span>
230-
<span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">42</span><span class="p">;</span><span class="w"> </span><span class="c1">// (2) 未定義動作(nullポインタのデリファレンス)</span>
231-
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">"World!</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// (3) 出力</span>
227+
<span class="kt">void</span><span class="w"> </span><span class="nf">inc</span><span class="p">(</span><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
228+
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">p</span><span class="p">)</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">fputs</span><span class="p">(</span><span class="s">"Null!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">stderr</span><span class="p">);</span><span class="w"> </span><span class="c1">// (1) エラー出力(削除される可能性がある)</span>
229+
<span class="w"> </span><span class="o">++*</span><span class="n">p</span><span class="p">;</span><span class="w"> </span><span class="c1">// (2) pがnullなら未定義動作</span>
232230
<span class="p">}</span>
233231
</code></pre></div>
234232
</p>
235233
<p><code>std::observable_checkpoint()</code>を呼び出すと、その時点で観測可能チェックポイントが設置される。観測可能チェックポイントより前に完了した操作の観測可能な動作は、その後に発生する<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>によって遡って無効化されないことが保証される。これにより、タイムトラベル最適化を抑止できる:</p>
236234
<p><div class="codehilite"><pre><span></span><code><span class="cp">#include <a href="../cstdio.html">&lt;cstdio&gt;</a></span>
237235
<span class="cp">#include <a href="../utility.html">&lt;utility&gt;</a></span>
238236

239-
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
240-
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">"Hello, "</span><span class="p">);</span><span class="w"> </span><span class="c1">// (1) 出力</span>
241-
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">observable_checkpoint</span><span class="p">();</span><span class="w"> </span><span class="c1">// ここまでの観測可能な動作を保護</span>
242-
<span class="w"> </span><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">nullptr</span><span class="p">;</span>
243-
<span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">42</span><span class="p">;</span><span class="w"> </span><span class="c1">// (2) 未定義動作</span>
244-
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">"World!</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// (3) 出力</span>
237+
<span class="kt">void</span><span class="w"> </span><span class="nf">inc</span><span class="p">(</span><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
238+
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">p</span><span class="p">)</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">fputs</span><span class="p">(</span><span class="s">"Null!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">stderr</span><span class="p">);</span><span class="w"> </span><span class="c1">// (1) エラー出力</span>
239+
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">observable_checkpoint</span><span class="p">();</span><span class="w"> </span><span class="c1">// ここまでの観測可能な動作を保護</span>
240+
<span class="w"> </span><span class="o">++*</span><span class="n">p</span><span class="p">;</span><span class="w"> </span><span class="c1">// (2) pがnullなら未定義動作</span>
245241
<span class="p">}</span>
246242
</code></pre></div>
247243
</p>
248-
<p>この場合、<code>std::observable_checkpoint()</code>によって(1)の出力<code>"Hello, "</code>が保護され、(2)の<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>があっても遡って消去されない。</p>
244+
<p>この場合、<code>std::observable_checkpoint()</code>によって(1)のエラー出力が保護され、(2)の<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>があっても遡って消去されない。</p>
249245
<p><code>std::observable_checkpoint()</code>の明示的な呼び出しに加え、以下の操作も暗黙的に観測可能チェックポイントを設置する:</p>
250246
<ul>
251247
<li>C標準の入出力関数(<code><a href="../cstdio/printf.html">std::printf()</a></code><code><a href="../cstdio/fwrite.html">std::fwrite()</a></code>など)のうち、ファイルへのデータ書き込みを行う関数呼び出しからの復帰<ul>
252248
<li>デフォルトの<code><a href="../ios/ios_base/sync_with_stdio.html">sync_with_stdio(true)</a></code>の状態では、<code><a href="../iostream/cout.html">std::cout</a></code>などの標準ストリームは<code>stdout</code>と同期しているため、これに該当する</li>
253249
</ul>
254250
</li>
255251
<li><code><a href="../fstream/basic_ofstream.html">std::ofstream</a></code>などのファイルストリーム出力時の<code><a href="../fstream/basic_filebuf.html">std::basic_filebuf</a></code>のオーバーフロー操作(バッファの内容をファイルに書き出した時点)</li>
256-
<li>Unicode出力時の<code><a href="../print/print.html">std::print()</a></code> / <code><a href="../print/println.html">std::println()</a></code>の内部出力関数<code><a href="../print/vprint_unicode.html">std::vprint_unicode()</a></code>によるターミナルへの書き込み(<code><a href="../ostream.html">&lt;ostream&gt;</a></code>版および<code><a href="../print.html">&lt;print&gt;</a></code>版)</li>
252+
<li>Unicode出力時の<code><a href="../print/print.html">std::print()</a></code> / <code><a href="../print/println.html">std::println()</a></code>の内部出力関数<code><a href="../print/vprint_unicode.html">std::vprint_unicode()</a></code>によるターミナルへの書き込み(<code><a href="../ostream.html">&lt;ostream&gt;</a></code>版および<code><a href="../print.html">&lt;print&gt;</a></code>版)<ul>
253+
<li>Unicode出力時はネイティブのOS API(Windowsでの<code>WriteConsoleW()</code>など)を直接使用しC標準の入出力を経由しないため、このルールで明示的にカバーしている</li>
254+
<li>非Unicode出力時はC標準I/O関数を経由するため、上記のC標準入出力関数のルールでカバーされる</li>
255+
</ul>
256+
</li>
257257
</ul>
258258
<p>上記の例では<code>std::printf()</code>がC標準の入出力関数であるため、(1)の呼び出しの復帰が暗黙の観測可能チェックポイントとなり、<code>"Hello, "</code>の出力は(2)の<a class="cpprefjp-defined-word" data-desc="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。" href="../../implementation-compliance.html#dfn-undefined-behavior">未定義動作</a>によって遡って消去されない。</p>
259259
<h2>効果</h2>

rss.xml

Lines changed: 72 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,80 @@
22
<feed xmlns="http://www.w3.org/2005/Atom">
33
<title>cpprefjp - C++日本語リファレンス</title>
44
<link href="https://cpprefjp.github.io" />
5-
<updated>2026-03-27T06:11:25.606127</updated>
6-
<id>8388eb2f-2bbd-4a0f-99de-bb4fda2a3715</id>
5+
<updated>2026-03-27T06:27:22.252115</updated>
6+
<id>2a69506c-f73f-44ba-afb1-c09c9f87ccea</id>
77

88

9+
<entry>
10+
<title>observable_checkpoint -- observable_checkpoint : ルールのカバー状況と動機となる例を記載 #1418</title>
11+
<link href="https://cpprefjp.github.io/reference/utility/observable_checkpoint.html"/>
12+
<id>d8f8beb93575d1d276829c2a84637f33777ed231:reference/utility/observable_checkpoint.md</id>
13+
<updated>2026-03-27T15:23:25+09:00</updated>
14+
15+
<summary type="html">&lt;pre&gt;&lt;code&gt;diff --git a/reference/utility/observable_checkpoint.md b/reference/utility/observable_checkpoint.md
16+
index 879bca256..ba08d559b 100644
17+
--- a/reference/utility/observable_checkpoint.md
18+
+++ b/reference/utility/observable_checkpoint.md
19+
@@ -15,16 +15,14 @@ namespace std {
20+
21+
C++では未定義動作を含むプログラムに対して、コンパイラは未定義動作が「将来」発生することを根拠に、それより「前」の操作を削除・変更する最適化を行うことが許容される。これは「タイムトラベル最適化」と呼ばれる。
22+
23+
-例として以下のコードでは、(2)で未定義動作があるため、(1)の出力すら省略される可能性がある:
24+
+例として以下のコードでは、nullポインタが渡された場合にエラーメッセージを出力してからデリファレンスに到達する意図だが、コンパイラは`++*p`が未定義動作にならないと仮定して`p`がnullでないと推論し、`if(!p)`の分岐ごと削除できる。その結果、エラーメッセージが出力されることなくクラッシュする可能性がある:
25+
26+
```cpp
27+
#include &amp;lt;cstdio&amp;gt;
28+
29+
-int main() {
30+
- std::printf(&amp;#34;Hello, &amp;#34;); // (1) 出力
31+
- int* p = nullptr;
32+
- *p = 42; // (2) 未定義動作(nullポインタのデリファレンス)
33+
- std::printf(&amp;#34;World!\n&amp;#34;); // (3) 出力
34+
+void inc(int* p) {
35+
+ if (!p) std::fputs(&amp;#34;Null!\n&amp;#34;, stderr); // (1) エラー出力(削除される可能性がある)
36+
+ ++*p; // (2) pがnullなら未定義動作
37+
}
38+
```
39+
40+
@@ -34,16 +32,14 @@ int main() {
41+
#include &amp;lt;cstdio&amp;gt;
42+
#include &amp;lt;utility&amp;gt;
43+
44+
-int main() {
45+
- std::printf(&amp;#34;Hello, &amp;#34;); // (1) 出力
46+
- std::observable_checkpoint(); // ここまでの観測可能な動作を保護
47+
- int* p = nullptr;
48+
- *p = 42; // (2) 未定義動作
49+
- std::printf(&amp;#34;World!\n&amp;#34;); // (3) 出力
50+
+void inc(int* p) {
51+
+ if (!p) std::fputs(&amp;#34;Null!\n&amp;#34;, stderr); // (1) エラー出力
52+
+ std::observable_checkpoint(); // ここまでの観測可能な動作を保護
53+
+ ++*p; // (2) pがnullなら未定義動作
54+
}
55+
```
56+
57+
-この場合、`std::observable_checkpoint()`によって(1)の出力`&amp;#34;Hello, &amp;#34;`が保護され、(2)の未定義動作があっても遡って消去されない。
58+
+この場合、`std::observable_checkpoint()`によって(1)のエラー出力が保護され、(2)の未定義動作があっても遡って消去されない。
59+
60+
`std::observable_checkpoint()`の明示的な呼び出しに加え、以下の操作も暗黙的に観測可能チェックポイントを設置する:
61+
62+
@@ -51,6 +47,8 @@ int main() {
63+
- デフォルトの[`sync_with_stdio(true)`](/reference/ios/ios_base/sync_with_stdio.md)の状態では、[`std::cout`](/reference/iostream/cout.md)などの標準ストリームは`stdout`と同期しているため、これに該当する
64+
- [`std::ofstream`](/reference/fstream/basic_ofstream.md)などのファイルストリーム出力時の[`std::basic_filebuf`](/reference/fstream/basic_filebuf.md)のオーバーフロー操作(バッファの内容をファイルに書き出した時点)
65+
- Unicode出力時の[`std::print()`](/reference/print/print.md) / [`std::println()`](/reference/print/println.md)の内部出力関数[`std::vprint_unicode()`](/reference/print/vprint_unicode.md)によるターミナルへの書き込み([`&amp;lt;ostream&amp;gt;`](/reference/ostream.md)版および[`&amp;lt;print&amp;gt;`](/reference/print.md)版)
66+
+ - Unicode出力時はネイティブのOS API(Windowsでの`WriteConsoleW()`など)を直接使用しC標準の入出力を経由しないため、このルールで明示的にカバーしている
67+
+ - 非Unicode出力時はC標準I/O関数を経由するため、上記のC標準入出力関数のルールでカバーされる
68+
69+
上記の例では`std::printf()`がC標準の入出力関数であるため、(1)の呼び出しの復帰が暗黙の観測可能チェックポイントとなり、`&amp;#34;Hello, &amp;#34;`の出力は(2)の未定義動作によって遡って消去されない。
70+
71+
&lt;/code&gt;&lt;/pre&gt;</summary>
72+
73+
<author>
74+
<name>Akira Takahashi</name>
75+
<email>faithandbrave@gmail.com</email>
76+
</author>
77+
</entry>
78+
979
<entry>
1080
<title>observable_checkpoint -- observable_checkpoint : coutやfstreamの扱いを記載 #1418</title>
1181
<link href="https://cpprefjp.github.io/reference/utility/observable_checkpoint.html"/>
@@ -2477,30 +2547,4 @@ index 555ecf243..6f868b151 100644
24772547
</author>
24782548
</entry>
24792549

2480-
<entry>
2481-
<title>comp-name -- text_encoding::comp-name : meta exposition-only タグを追加</title>
2482-
<link href="https://cpprefjp.github.io/reference/text_encoding/text_encoding/comp-name.html"/>
2483-
<id>c08dfb5dce7d73795d1858dbc71a964b668e0c3c:reference/text_encoding/text_encoding/comp-name.md</id>
2484-
<updated>2026-03-26T13:51:34+09:00</updated>
2485-
2486-
<summary type="html">&lt;pre&gt;&lt;code&gt;diff --git a/reference/text_encoding/text_encoding/comp-name.md b/reference/text_encoding/text_encoding/comp-name.md
2487-
index 1a3b13317..4d55a9da0 100644
2488-
--- a/reference/text_encoding/text_encoding/comp-name.md
2489-
+++ b/reference/text_encoding/text_encoding/comp-name.md
2490-
@@ -4,6 +4,7 @@
2491-
* text_encoding[meta class]
2492-
* function[meta id-type]
2493-
* cpp26[meta cpp]
2494-
+* [meta exposition-only]
2495-
2496-
```cpp
2497-
static constexpr bool comp-name(string_view a, string_view b); // 説明専用
2498-
&lt;/code&gt;&lt;/pre&gt;</summary>
2499-
2500-
<author>
2501-
<name>Raclamusi</name>
2502-
<email>raclamusi@gmail.com</email>
2503-
</author>
2504-
</entry>
2505-
25062550
</feed>

0 commit comments

Comments
 (0)