1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Windowsのclangで2通りのHello, World!

Last updated at Posted at 2019-01-20

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にはありませんでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?