「Optimized C++ ― 最適化、高速化のためのプログラミングテクニック」コンパイルしてみた(2)cache.cpp

Optimized C++ ― 最適化、高速化のためのプログラミングテクニック
著者：Kurt Guntheroth、訳：黒川 利明、技術監修：島 敏博　
https://www.oreilly.co.jp/books/9784873117928/

sample
http://www.oreilly.co.jp/pub/9784873117928/opcpp_sample.zip

# 目的(purpose)
"Optimized C++"コンパイル記録は、コンパイラおよび対応標準により、コンパイルエラーMessageの違いを記録し、どのエラーが出たら、どの対応標準にすればエラーが少なくなるかを考察するための資料の第一歩です。
上記 sampleファイルにはコンパイルする仕組みを提供していない。簡易な台本(script)を作成する。


# 成果(outcome)
## 計画(plan)
(1)コンパイラの種類、対応標準の違いによってエラーの数が違う。
(2)同じエラー、警告であってもMessageの表現が違う。
(3) エラー、警告のMessageをネットで検索する際に役立てる。
## 結果(result)
わかったこと３つ。
1) Win32.cppと一緒にコンパイルする
2) /EHscオプションをつける
3) main関数がある関数と一緒にコンパイルする
4) 選択肢を変えて一括処理する台本(script)試作

# 編纂器(compiler) 
Windows固有のファイルがある。ひとまずVisual Studio2017 express開発コマンドラインでコンパイルしてみた。

## 編纂選択肢(compile option)
https://msdn.microsoft.com/ja-jp/library/19z1t1wy.aspx

| 選択肢 | 目的 |
|:--|:--|
| /EH | 例外処理のモデルを指定します。 |
| /Os | 実行可能ファイルで、サイズの小ささを優先させます。 |
| /Ot | 実行可能ファイルで、実行速度を優先させます。 |
| /Ox | 最大限の最適化 (/Ob2 ～ /Gs) を行います。 |
| /WL | コマンド ラインから C++ ソース コードをコンパイルするときに、エラー メッセージと警告メッセージの 1 行診断を有効にします。 |
| /Wall | 既定で無効にされた警告も含めてすべての警告を有効にします。 |

/EHsc
https://msdn.microsoft.com/ja-jp/library/1deeycx5.aspx
「
s
C++ 例外のみをキャッチし、extern "C" として宣言された関数が例外をスローする可能性があるものと想定するようにコンパイラに指示する例外処理モデル。
c
s (/EHsc) と共に使用すると、C++ 例外のみをキャッチし、extern "C" として宣言された関数が C++ 例外をスローしないものと想定するようにコンパイラに指示します。」

# 算譜(source code)
### cache.cpp

```shell-session:cl 

>cl cache.cpp win32.cpp /EHsc
Microsoft(R) C/C++ Optimizing Compiler Version 19.14.26430 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

cache.cpp
win32.cpp
コードを生成中...
Microsoft (R) Incremental Linker Version 14.14.26430.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:cache.exe
cache.obj
win32.obj

C:\\opcpp_sample\opcpp>dir cache*

2018/06/19  09:23             1,557 cache.cpp
2018/06/19  10:38           230,400 cache.exe
2018/06/19  10:38           150,555 cache.obj
2018/06/19  09:23             2,863 cache_test.cpp

C:\opcpp_sample\opcpp>cache
multiplier set to 1
All tests pass
size of struct S1: 24
    offset of c1: 0
    offset of s1: 2
    offset of d1: 8
    offset of i1: 16
    offset of c2: 20
size of struct S1a: 32
    offset of c3: 24
size of struct S2: 16
```

## /Os（空間最適化）

```shell-session
cl cache.cpp win32.cpp /EHsc /WL /Wall  /Os   
Microsoft(R) C/C++ Optimizing Compiler Version 19.14.26430 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

cache.cpp
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\vcruntime_exception.h(25): warning C4820: '__std_exception_data': '3' バイトのパディングを データ メンバー '__std_exception_data::_DoFree' の後に追加しました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\vcruntime_typeinfo.h(44): warning C4820: '__std_type_info_data': '3' バイトのパディングを データ メンバー '__std_type_info_data::_DecoratedName' の後に追加しました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xutility(4231): warning C4820: 'std::_Yarn<char>': '3' バイトのパディングを データ メンバー 'std::_Yarn<char>::_Nul' の後に追加しました。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocinfo(228): note: コンパイル対象の クラス テンプレート インスタンス化 'std::_Yarn<char>' のリファレンスを確認してください
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xutility(4231): warning C4820: 'std::_Yarn<wchar_t>': '2' バイトのパディングを データ メンバー 'std::_Yarn<wchar_t>::_Nul' の後に追加しました。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocinfo(230): note: コンパイル対象の クラス テンプレート インスタンス化 'std::_Yarn<wchar_t>' のリファレンスを確認してください
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\memory(778): warning C4365: '引数': 'std::_Atomic_integral_t' から 'long' に変換しました。signed/unsigned が一致しません。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\memory(823): warning C4365: 'return': 'std::_Atomic_integral_t' から 'long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(243): warning C4820: 'std::locale::_Locimp': '3' バイトのパディングを データ メンバー 'std::locale::_Locimp::_Xparent' の後に追加しました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(484): warning C4820: 'std::locale': '3' バイトのパディングを 基底クラス 'std::_Crt_new_delete' の後に追加しました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(120): warning C4365: '=': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(326): warning C4571: 情報: catch(...) の意味が Visual C++ 7.1 から変更されています。構造化例外 (SEH) はキャッチされません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(352): warning C4571: 情報: catch(...) の意味が Visual C++ 7.1 から変更されています。構造化例外 (SEH) はキャッチされません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(797): warning C4625: 'std::codecvt_base': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(797): warning C4626: 'std::codecvt_base': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1266): warning C4625: 'std::codecvt<char16_t,char,_Mbstatet>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1266): warning C4626: 'std::codecvt<char16_t,char,_Mbstatet>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1062): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1064): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1066): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1068): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1152): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1156): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1533): warning C4625: 'std::codecvt<char32_t,char,_Mbstatet>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1533): warning C4626: 'std::codecvt<char32_t,char,_Mbstatet>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1374): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1376): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1378): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1380): warning C4365: '=': 'int' から 'unsigned long' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1781): warning C4625: 'std::codecvt<wchar_t,char,_Mbstatet>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1781): warning C4626: 'std::codecvt<wchar_t,char,_Mbstatet>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1625): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1691): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1720): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1741): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2030): warning C4625: 'std::codecvt<unsigned short,char,_Mbstatet>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2030): warning C4626: 'std::codecvt<unsigned short,char,_Mbstatet>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1874): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1940): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1969): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(1990): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2078): warning C4625: 'std::ctype_base': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2078): warning C4626: 'std::ctype_base': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2539): warning C4625: 'std::ctype<char>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2539): warning C4626: 'std::ctype<char>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2520): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2533): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2760): warning C4625: 'std::ctype<wchar_t>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2760): warning C4626: 'std::ctype<wchar_t>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2983): warning C4625: 'std::ctype<unsigned short>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(2983): warning C4626: 'std::ctype<unsigned short>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(3028): warning C4625: 'std::ctype_byname<char>': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocale(3028): warning C4626: 'std::ctype_byname<char>': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(498): warning C4625: 'std::_Generic_error_category': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(498): warning C5026: 'std::_Generic_error_category': 移動コンストラクターが暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(498): warning C4626: 'std::_Generic_error_category': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(498): warning C5027: 'std::_Generic_error_category': 移動代入演算子が暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(526): warning C4625: 'std::_Iostream_error_category': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(526): warning C5026: 'std::_Iostream_error_category': 移動コンストラクターが暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(526): warning C4626: 'std::_Iostream_error_category': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(526): warning C5027: 'std::_Iostream_error_category': 移動代入演算子が暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(574): warning C4625: 'std::_System_error_category': コピー コンストラクターは暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(574): warning C5026: 'std::_System_error_category': 移動コンストラクターが暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(574): warning C4626: 'std::_System_error_category': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\system_error(574): warning C5027: 'std::_System_error_category': 移動代入演算子が暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xiosbase(647): warning C4820: 'std::ios_base': '4' バイトのパディングを データ メンバー 'std::ios_base::_Ploc' の後に追加しました。
cache.cpp(14): warning C4820: 'test_cache::S1': '1' バイトのパディングを データ メンバー 'test_cache::S1::c1' の後に追加しました。
cache.cpp(15): warning C4820: 'test_cache::S1': '4' バイトのパディングを データ メンバー 'test_cache::S1::s1' の後に追加しました。
cache.cpp(18): warning C4820: 'test_cache::S1': '3' バイトのパディングを データ メンバー 'test_cache::S1::c2' の後に追加しました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ios(192): warning C4820: 'std::basic_ios<char,std::char_traits<char>>': '7' バイトのパディングを データ メンバー 'std::basic_ios<char,std::char_traits<char>>::_Fillch' の後に追加しました。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(42): note: コンパイル対象の クラス テンプレート インスタンス化 'std::basic_ios<char,std::char_traits<char>>' のリファレンスを確認してくださいcache.cpp(19): note: コンパイル対象の クラス テンプレート インスタンス化 'std::basic_ostream<char,std::char_traits<char>>' のリファレンスを確認してください
cache.cpp(28): warning C4820: 'test_cache::S1a': '7' バイトのパディングを データ メンバー 'test_cache::S1a::c3' の後に追加しました。
cache.cpp(46): warning C4100: 'argv': 引数は関数の本体部で 1 度も参照されません。
cache.cpp(46): warning C4100: 'argc': 引数は関数の本体部で 1 度も参照されません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xutility(4171): warning C4365: '初期化中': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xutility(4161): note: クラス テンプレート のメンバー関数 'std::_Yarn<wchar_t> &std::_Yarn<wchar_t>::operator =(const _Elem *) with [_Elem=wchar_t]' のコンパイル中C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocinfo(191): note: コンパイル対象の関数 テンプレート インスタンス化 'std::_Yarn<wchar_t> &std::_Yarn<wchar_t>::operator =(const _Elem *) with [_Elem=wchar_t]' のリファレンスを確認してくださいC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocinfo(230): note: コンパイル対象の クラス テンプレート インスタンス化 'std::_Yarn<wchar_t>' のリファレンスを確認してください

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(161): warning C4820: 'std::basic_ostream<char,std::char_traits<char>>::sentry': '3' バイトのパディングを データ メンバー 'std::basic_ostream<char,std::char_traits<char>>::sentry::_Ok' の後に追加しました。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(323): note: コンパイル対象の クラス テンプレート インスタンス化 'std::basic_ostream<char,std::char_traits<char>>::sentry' のリファレンスを確認してくださいC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(321): note: クラス テンプレート のメンバー関数 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned int)' のコンパイル中cache.cpp(24): note: コンパイル対象の関数 テンプレート インスタンス化 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned int)' のリファレンスを確認してくださいcache.cpp(19): note: コンパイル対象の クラス テンプレート インスタンス化 'std::basic_ostream<char,std::char_traits<char>>' のリファレンスを確認してください
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1664): warning C4625: 'std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>> with [_Elem=char, _Traits=std::char_traits<char>]': コピー コンストラクターは暗黙的に削除済みとして定義されましたC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(330): note: コンパイル対象の クラス テンプレート インスタンス化 'std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>> with [_Elem=char, _Traits=std::char_traits<char>]' のリファレンスを確認してください
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1664): warning C4626: 'std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>> with [_Elem=char, _Traits=std::char_traits<char>]': 代入演算子は暗黙的に削除済みとして定義されました
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\streambuf(674): warning C4820: 'std::ostreambuf_iterator<_Elem,_Traits> with [_Elem=char, _Traits=std::char_traits<char>]': '3' バイトのパディングを データ メンバー 'std::ostreambuf_iterator<_Elem,_Traits> with [_Elem=char, _Traits=std::char_traits<char>]::_Failed' の後に追加しました。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(330): note: コンパイル対象の クラス テンプレート インスタンス化 'std::ostreambuf_iterator<_Elem,_Traits> with [_Elem=char, _Traits=std::char_traits<char>]' のリファレンスを確認してください
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(333): warning C4571: 情報: catch(...) の意味が Visual C++ 7.1 から変更されています。構造化例外 (SEH) はキャッチされません。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1457): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1453): note: クラス テンプレート のメンバー関数 'std::ostreambuf_iterator<_Elem,_Traits> std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>>::do_put(_OutIt,std::ios_base &,_Elem,const void *) const with [_Elem=char, _Traits=std::char_traits<char>, _OutIt=std::ostreambuf_iterator<char,std::char_traits<char>>]' のコンパイル中C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(330): note: コンパイル対象の クラス テンプレート インスタンス化 'std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>> with [_Elem=char, _Traits=std::char_traits<char>]' のリファレンスを確認してくださいC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ostream(321): note: クラス テンプレート のメンバー関数 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned int)' のコンパイル中cache.cpp(24): note: コンパイル対象の関数 テンプレート インスタンス化 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned int)' のリファレンスを確認してください
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1448): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1429): note: クラス テンプレート のメンバー関数 'std::ostreambuf_iterator<_Elem,_Traits> std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>>::do_put(_OutIt,std::ios_base &,_Elem,long double) const with [_Elem=char, _Traits=std::char_traits<char>, _OutIt=std::ostreambuf_iterator<char,std::char_traits<char>>]' のコンパイル中
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1446): warning C4774: 'sprintf_s' : 引数 3 に必要な書式文字列が文字列リテラルではありませんC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1446): note: たとえば、'name' の形式指定子はセキュリティ上の問題を引き起こす可能性があるため、printf(名前); の代わりに printf("%s", 名前); を使用しますC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1446): note: 名前付き文字列リテラルに対し constexpr 指定子を使用することをお勧めします
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1424): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1405): note: クラス テンプレート のメンバー関数 'std::ostreambuf_iterator<_Elem,_Traits> std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>>::do_put(_OutIt,std::ios_base &,_Elem,double) const with [_Elem=char, _Traits=std::char_traits<char>, _OutIt=std::ostreambuf_iterator<char,std::char_traits<char>>]' のコンパイル中
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1422): warning C4774: 'sprintf_s' : 引数 3 に必要な書式文字列が文字列リテラルではありませんC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1422): note: たとえば、'name' の形式指定子はセキュリティ上の問題を引き起こす可能性があるため、printf(名前); の代わりに printf("%s", 名前); を使用しますC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1422): note: 名前付き文字列リテラルに対し constexpr 指定子を使用することをお勧めします
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1400): warning C4365: '引数': 'int' から 'size_t' に変換しました。signed/unsigned が一致しません。C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\xlocnum(1395): note: クラス テンプレート のメンバー関数 'std::ostreambuf_iterator<_Elem,_Traits> std::num_put<_Elem,std::ostreambuf_iterator<_Elem,_Traits>>::do_put(_OutIt,std::ios_base &,_Elem,unsigned __int64) const with [_Elem=char, _Traits=std::char_traits<char>, _OutIt=std::ostreambuf_iterator<char,std::char_traits<char>>]' のコンパイル中
（中略）
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ios(330): warning C4514: 'std::showpos': 参照されていないインライン関数は削除されました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ios(336): warning C4514: 'std::skipws': 参照されていないインライン関数は削除されました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ios(342): warning C4514: 'std::unitbuf': 参照されていないインライン関数は削除されました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\ios(348): warning C4514: 'std::uppercase': 参照されていないインライン関数は削除されました。
win32.cpp
(中略)
コードを生成中...
Microsoft (R) Incremental Linker Version 14.14.26430.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:cache.exe 
cache.obj 
win32.obj 

C:\Users\ozaki\Downloads\opcpp_sample\opcpp>cache
multiplier set to 1
All tests pass
size of struct S1: 24
    offset of c1: 0
    offset of s1: 2
    offset of d1: 8
    offset of i1: 16
    offset of c2: 20
size of struct S1a: 32
    offset of c3: 24
size of struct S2: 16

>dir cache* 

2018/06/19  09:23             1,557 cache.cpp
2018/06/20  13:48           225,792 cache.exe
2018/06/20  13:48           148,506 cache.obj
2018/06/19  09:23             2,863 cache_test.cpp
2018/06/20  08:26           169,794 cache_test.obj

```
##/Ot（時間最適化）

```shell-session
cl cache.cpp win32.cpp /EHsc /WL /Wall  /Ot   
Microsoft(R) C/C++ Optimizing Compiler Version 19.14.26430 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

cache.cpp
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\vcruntime_exception.h(25): warning C4820: '__std_exception_data': '3' バイトのパディングを データ メンバー '__std_exception_data::_DoFree' の後に追加しました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\vcruntime_typeinfo.h(44): warning C4820: '__std_type_info_data': '3' バイトのパディングを データ メンバー '__std_type_info_data::_DecoratedName' の後に追加しました。

（中略）
コードを生成中...
Microsoft (R) Incremental Linker Version 14.14.26430.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:cache.exe 
cache.obj 
win32.obj 

C:\Users\ozaki\Downloads\opcpp_sample\opcpp>cache
multiplier set to 1
All tests pass
size of struct S1: 24
    offset of c1: 0
    offset of s1: 2
    offset of d1: 8
    offset of i1: 16
    offset of c2: 20
size of struct S1a: 32
    offset of c3: 24
size of struct S2: 16
>dir cache* 

2018/06/19  09:23             1,557 cache.cpp
2018/06/20  13:49           230,400 cache.exe
2018/06/20  13:49           150,555 cache.obj
2018/06/19  09:23             2,863 cache_test.cpp
2018/06/20  08:26           169,794 cache_test.obj
```
### /Ox(最大の最適化)

```shell-session
>cl cache.cpp win32.cpp /EHsc /WL /Wall  /Ox   
Microsoft(R) C/C++ Optimizing Compiler Version 19.14.26430 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

cache.cpp
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\vcruntime_exception.h(25): warning C4820: '__std_exception_data': '3' バイトのパディングを データ メンバー '__std_exception_data::_DoFree' の後に追加しました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\vcruntime_typeinfo.h(44): warning C4820: '__std_type_info_data': '3' バイトのパディングを データ メンバー '__std_type_info_data::_DecoratedName' の後に追加しました。
(中略)
>dir cache* 


2018/06/19  09:23             1,557 cache.cpp
2018/06/20  13:55           220,160 cache.exe
2018/06/20  13:55           167,984 cache.obj
2018/06/19  09:23             2,863 cache_test.cpp
2018/06/20  08:26           169,794 cache_test.obj
```

## 比較表

|  | /EHsc | /Os | /Ot | /Ox |
|:--|--:|--:|--:|--:|
| cache |  |  225,792 |  230,400 | 220,160 | 

## 台本(script)

```shell:clop.bat
cl cache.cpp Win32.cpp  /WL /Wall %1 %2 %3
cache
dir cache*
```

###台本実行方法

Windowsバッチファイル引数
http://capm-network.com/?tag=Windowsバッチファイル引数

標準エラー出力をファイルへ出力
https://www.adminweb.jp/command/redirect/index3.html

```shell_session
> clop > clop.log 2>&1
> clop /Os > clopOs.log 2>&1
> clop /Ot > clopOt.log 2>&1
> clop /Ox > clopOx.log 2>&1
```



### 記録置き場
 clop > clop.log 2>&1
https://researchmap.jp/muheheoc7-45645/?action=multidatabase_action_main_filedownload&download_flag=1&upload_id=164938&metadata_id=25961
 clop /Os > clopOs.log 2>&1
https://researchmap.jp/mubmlxr29-45645/?action=multidatabase_action_main_filedownload&download_flag=1&upload_id=164936&metadata_id=25961
 clop /Ot > clopOt.log 2>&1
https://researchmap.jp/munh0ebkr-45645/?action=multidatabase_action_main_filedownload&download_flag=1&upload_id=164937&metadata_id=25961
 clop /Ox > clopOx.log 2>&1
https://researchmap.jp/muheheoc7-45645/?action=multidatabase_action_main_filedownload&download_flag=1&upload_id=164938&metadata_id=25961

# 課題(agenda)
1. 全てのファイルの必要最小限の組み合わせ方の台本
2. 役に立つまたは意味のあるコンパイルエラーの取り方
3. 役に立つまたは意味のある出力の仕方

# 参考資料(reference)

### プログラミング言語教育のXYZ
https://qiita.com/kaizen_nagoya/items/1950c5810fb5c0b07be4
プログラミング言語教育のXYZ(youtube)
https://www.youtube.com/watch?v=He1_tg4px-w&t=486s

### Autosar Guidelines C++14
Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

### C++N4741 2018
Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4741.pdf

C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010

### C++N4606 2016
Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

C++N4606, 2016符号断片編纂一覧(example code compile list)
 Working Draft 2016, ISO/IEC 14882(1)
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

###　CEDD(Compile Error Driven Design) 
初めての　CEDD(Compile Error Driven Design) ８回直してコンパイル。
https://qiita.com/kaizen_nagoya/items/9494236aa1753f3fd1e1

コンパイルエラーを記録するとよい理由7つ
https://qiita.com/kaizen_nagoya/items/85c0e92b206883140e89
docker gnu(gcc/g++) and llvm(clang/clang++)
https://qiita.com/drafts/059874ea39c4de64c0f7

[C][C++]の国際規格案の例題をコンパイルするときの課題７つ。
https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de

C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1


コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

C++2003とC++2017でコンパイルエラーになるならない事例集
https://qiita.com/kaizen_nagoya/items/a13ea3823441c430edff

Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

cpprefjpのdecltypeをコンパイル試験
https://qiita.com/kaizen_nagoya/items/090909af702f0d5d8a67

C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp
https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed

ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

The C++ Standard Library: clang++とg++でコンパイルしてみた(まとめ)
https://qiita.com/kaizen_nagoya/items/9bdfaa392443d13e5759

C++17 - The Complete Guide clang++とg++でコンパイルしてみた(まとめ)
https://qiita.com/kaizen_nagoya/items/c000f307e642990781e1

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

C言語（C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

'wchar.h' file not found で困った clang++ macOS
https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11

Open POSIX Test Suiteの使い方を調べはじめました
https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C まとめ #include <misra_c.h>
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

「C++完全理解ガイド」の同意できること上位10
https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671

C++参考資料一覧
https://researchmap.jp/joub9b3my-1797580/#_1797580
# 文献履歴(document history)
ver. 0.10 初稿 　20180620
ver. 0.11 ありがとう追記　20230413
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.