yohhoyの日記

技術的メモをしていきたい日記

MSVC

va_argマクロの奇妙な制限事項

C言語の可変引数リストアクセス用 va_arg マクロにおける奇妙な制限事項についてメモ。va_argマクロの第二引数へ指定する型名には、“関数ポインタ型” や “配列へのポインタ型” を直接記述できない。ただしtypedefによる別名であればOK。こんなコード書くやつ…

swap(T, U)とis_swappable_with<T, U>とvector<bool>

C++17標準ライブラリには「型が異なる変数間での値交換(swap)」可能か否かを判定するメタ関数 std::is_(nothrow_)swappable_with<T, U> が存在する。一般的には値交換操作は同一型変数間(swap(T&, T&))で行われるが、プロキシ型(proxy)のような特殊ケースにおいて</t,>…

Win32 Debug CRT Heap Internals

Windows OS上のMicrosoft Visual C++(MSVC)ランタイムライブラリにおける、デバック動作時のヒープメモリ管理用内部データ構造情報。 Win32 Debug CRT Heap Internals

hardware_{destructive,constructive}_interference_size

C++17で標準ライブラリ <new> ヘッダに追加された hardware_destructive_interference_size, hardware_constructive_interference_size について。 hardware_destructive_interference_size False-Sharing発生を防ぐために必要となる、最小のメモリアドレス距離。</new>…

参照型変数とメモリの関係

プログラミング言語C++の言語仕様では、メモリ空間上に 参照型(reference type) の実体が存在するか否かを規定しない(unspecified)。 スカラ型(scalar type)=算術型/列挙型/ポインタ型やその配列型などのオブジェクト(object)は、メモリ空間上に実体が配…

fallthrough属性利用時のちょっとした注意点

C++1z(C++17)で追加される fallthrough属性 の利用に関する注意点について。下記コードの★部ではフォールスルー(fallthrough)明示を意図しているが、C++コンパイラはプログラマの期待通り振舞わない。これは末尾セミコロン(;)を忘れたことで、fallthrough属…

IntelliSenseコンテキスト判別マクロ

Visual Studio 2010以降では、IntelliSenseコンテキスト判別用マクロ__INTELLISENSE__が定義される。 #ifdef __INTELLISENSE__ ... #endif MSDN公式ドキュメントにはVisual Studio 2015以降から記載されている。関連URL Troubleshooting Tips for IntelliSen…

C++/CLIとC++/CXの差分リスト

Microsoft社による独自拡張言語 C++/CLI*1 と C++/CX*2 の差分について。主に言語機能の観点での差分リスト。MSDNフォーラムでのDeon Brewis氏*3回答による。引用中の/clrは C++/CLI に、/ZWは C++/CX に対応する(いずれもVisual C++のコンパイラオプション…

C++ demangler on Web

オンラインでC++名前デマングル結果を確認できるWebサービス。gcc(g++), Microsoft Visual C++(MSVC)に対応。 https://demangler.com/ GCC and MSVC C++ Demangler https://d.fuqu.jp/c++filtjs/ c++filtjs 関連URL Is there an online name demangler for C…

printfファミリ書式指定%nの応用例

printf関数ファミリの滅多に使われない書式指定 %n を利用したコードの例。本記事の内容はStack Overflowで見つけた質問と回答に基づく。 int n; printf("%s: %nFoo\n", "hello", &n); printf("%*sBar\n", n, ""); 出力: hello: Foo Bar VisualC++の注意 MS…

const値型へのユーザ定義変換演算子と引数lvalue/rvalueオーバーロードの落とし穴

C++11以降では、ユーザ定義変換演算子(user-defined conversion operator)の戻り値型では const T よりも T としたほうが良い。関数オーバーロードで引数型 const T& および T&& を受ける関数*1へ渡す際に、同関数呼び出し時のオーバーロード解決失敗による…

参照型の{}初期化

C++11で導入されたUniform Initializationと参照型変数に関するメモ。C++11(N3337)言語仕様の問題としてCWG defect #1288で挙げられ、C++14 Draft N3376にてWording修正が適用された。*1 struct S {}; int main() { S v; S & r{ v }; // ?? } gcc gcc 4.8.2…

乱数生成器のサイズ

C++11標準ライブラリに追加された乱数生成器(RNG; Random Number Generator)のオブジェクトサイズについてメモ。注意:具体的なオブジェクトサイズは実装依存となるため、下表は各オブジェクト間のオーダー比較程度に解釈すること。 RNG gcc/64 gcc/32 Clang…

Visual Studio 2012でサポート済みのC++14機能

Microsoft Visual Studio 2012(MSVC11)でサポートされているC++14機能についてメモ。本記事の内容はMicrosoft Build 2013 "The Future of C++"スライド資料に基づく。MSVC11では、C++14導入予定の「ラムダ式の戻り値型推論の制限緩和」に対応しているとのこ…

volatile教、あるいはvolatile狂

本文こちら→volatile教、あるいはvolatile狂 - yohhoyの日記(別館)

C/C++ char型の符号有無

プログラミング言語C/C++のchar型が、符号あり/符号なしのいずれかは処理系定義(implementation defined)*1。各コンパイラでの実装についてメモ。まとめ: char型を「符号あり(signed)」と仮定しないこと。(とはいえ、この仮定をおくコードは多い…) 特にA…

ラムダ式から呼び出し規約指定つき関数ポインタへ

Microsoft Visual C++コンパイラにおける、C++ラムダ式から関数ポインタへの変換と関数呼び出し規約(calling convention)*1の扱いについてメモ。MSVC11以降では変数キャプチャを伴わないラムダ式(stateless lambda)を、任意の呼び出し規約をもつ関数ポインタ…

__COUNTER__マクロ

C/C++プリプロセッサにおいて、一意な識別子名生成に利用できる__COUNTER__マクロについて。非標準機能だが主要コンパイラで一通りサポートされている。 #define CAT_IMPL(s1, s2) s1##s2 #define CAT(s1, s2) CAT_IMPL(s1, s2) #ifdef __COUNTER__ #define …

#pragma detect_mismatch

Microsoft Visual C++ 2010(MSVC10)以降では、リンカでの不一致検知を行うdetect_mismatchプラグマが提供される。一例として、オブジェクト間のABI(Application Binary Interface)非互換検出に利用できる。関連URL c++ - Inline namespace emulation for MSV…

無名(匿名)名前空間の不思議な定義

プログラミング言語C++における無名名前空間(unnamed namespace)*1の、一見すると不思議な(実は根拠がある)定義に関するメモ。本記事はStack Overflow上での質問と回答内容に基づく。 C++言語仕様での定義 C++03 7.3.1.1/p1では、unnamed namespaceの振る…

_MSC_FULL_VERマクロ

Microsoft Visual C++コンパイラのバージョン判定マクロについて。2017-03-07追記:本ページはVC2012以降メンテナンスされていません。最新版はyumetodoさんによる _MSC_VERと_MSC_FULLVERをまとめる を参照下さい。メジャー/マイナーバージョンを判定するた…

古のK&R C in 2012

2012年現在のC言語コンパイラでもK&R Cソースコードを扱えるか試したのでメモ。*1結論:gccとMSVCはK&R Cソースコードでもコンパイル可能。 /* K&R style C */ int printf(); int add(); main(argc, argv) int argc; char** argv; { printf("1+2=%d\n", add(…

shared_ptrとスレッド安全性

C++11標準ライブラリのstd::shared_ptrオブジェクトでは、C++標準ライブラリの既定レベルのスレッド安全性(→id:yohhoy:20120513)を提供する。 同一オブジェクトを指していたとしても、異なる2つのshared_ptrオブジェクトは異なるスレッドからそれぞれ安全…

VisualStudio11作成アプリをWinXP上で動作させるHACK

2012-11-29追記:2012年11月リリース"Visual Studio 2012 Update 1"により、Visual Studio 2012(MSVC11)でもWindows XP上で動作可能なアプリケーションを作成可能となった。 → MSDN Blog - Visual Studio 2012 の Update 1 がご利用いただけるようになりまし…

static変数初期化とスレッドセーフ

yamasaさんのDCL解説記事で知った、「C++11規格においてブロックスコープなstatic変数の初期化処理はマルチスレッドセーフ」に関するメモ。該当箇所をN3337 6.7/p4より一部引用。(下線部は強調) Otherwise such a variable is initialized the first time …

Visual Studio 11 BetaのVariadic Templatesエセ対応

Visual Studio 11(MSVC11) Betaの可変長引数テンプレート(Variadic Templates)対応*1についてメモ。結論:言語機能としてはサポート一切なし。ただしC++標準ライブラリの一部をマクロでエミュレーション。MSVC12(?)に期待。MSVC11 C++ライブラリの既定では…

Windows APIコールバックでのラムダ式の利用

Visual Studio 11(MSVC11) Betaにおいて、C++11ラムダ式とWindows APIコールバック関数を組み合わせを試したのでメモ。C++11仕様“変数キャプチャを伴わないラムダ式は関数ポインタに変換可能”を利用し、コールバック関数を指定するWindows API関数へラムダ式…

restrictキーワードへの対応状況

C99で導入された restrict キーワード(→id:yohhoy:20120223)への対応状況メモ。 gcc系 gccはC99の restrict キーワードに対応している。また、C++でも利用可能な独自の __restrict__, __restrict キーワードを提供しており*1、C/C++のポインタ型と参照型お…

ローカルクラスとテンプレート引数

C++11から、テンプレート引数として関数内のローカルな型を指定できるようになった。(C++03以前ではNG) template <typename T> void foo(T const& t) {} struct X{}; int main() { struct Y{}; foo(X()); // C++03/C++11:well-formed foo(Y()); // C++03:ill-formed, C</typename>…

printfとsize_t型

C99にてsize_t型用の書式化文字列 長さ修飾子(length modifier) "z" が追加された。 #include <stdio.h> printf("%zu\n", sizeof(int)); なお、同時にptrdiff_t型用の長さ修飾子 "t" も追加されている。 gcc系 gcc(glibc 2.1以降)は "z" に対応している。ただし、厳密</stdio.h>…