Windows 10(64bit版)でHello Worldプログラムを2つ書いてclangでビルドしました。1つはC++標準ライブラリを用いた書き方で、もう1つはWindows API(Win32 API)を用いた書き方です。
C++標準ライブラリを用いた書き方
ソースコード
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!\n";
return 0;
}
実行コマンド
clang -Xclang -flto-visibility-public-std -o hello1.exe hello1.cpp
Windows APIを用いた書き方
ソースコード
#include <Windows.h>
// NOTE: WinMain関数ではWindowsコンソールアプリケーションを生成できないようでした
int main() {
char text[] = "Hello, World!\n";
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), text, strlen(text), NULL, NULL);
return 0;
}
ビルドコマンド
clang-cl -o hello2.exe hello2.cpp
考察
2つともHello, World!
を出力するプログラムなので速度の計測を行ってもあまり意味がありません。2つの実行ファイルのファイルサイズを比較してみました。
2019/01/20 12:57 111 hello1.cpp
2019/01/20 13:54 232,448 hello1.exe
2019/01/20 14:39 290 hello2.cpp
2019/01/20 14:39 93,696 hello2.exe
hello2.exeはC/C++標準ライブラリのランタイムのラッパーコードがない分だけ実行ファイルのサイズが小さくなります。hello2.cppのビルドについてはVisual Studioのcl.exeでも試していますがclangよりもcl.exeのほうが若干ファイルサイズが小さくなっているようでした。
clangはWindowsのビルドチェーンとしてはVisual Studioに比肩するほどのパワーを持ちますが、clangのドキュメントを読むと、MSVC(Visual Studio)対応はまだ途中であると書いてあります(2019年1月)。軽量な実行ファイルを作るのであればC/C++標準ライブラリのリンクは外しておきたいところですが、たったの200kBですので大人しく使っておいてもいいように思いました。
追記(2019.1.23)
twitterにて、斎藤敦志さんから1点ご指摘がございました。WindowsのWriteConsole関数は標準出力をリダイレクトした場合にはそのリダイレクト先に出力がされない、とのことでした。実際に、
hello1.exe > tmp1.txt
hello2.exe > tmp2.txt
を実行したときにtmp1.txtにはHello, World!
の出力がありましたがtmp2.txtにはありませんでした。