Making C++ Fun and Accessible.
より価値の高いソフトウェアを開発するために。C++エキスパート・高橋晶が薦める、C++の技術書5選 2024年7月16日 C++ライブラリアン 高橋 晶 C++日本語リファレンスサイトcpprefjpを運営し、C++の最新情報を日本語で発信している。株式会社Preferred Networksに所属し、スーパーコンピュータのソフトウェア開発に携わっている。 著書として、『C++テンプレートテクニック』(SBクリエイティブ)、『C++ポケットリファレンス』(技術評論社)、『プログラミングの魔導書』(ロングゲート)。 X: @cpp_akira GitHub: faithandbrave 1. 『Effective C++ 第3版』Scott Meyers 著、小林健一郎 翻訳 2. 『Effective Modern C++ ― C++11/14プログラムを進化させる42項目』Scott M
ご覧いただきありがとうございます。 Google Colaboratoryにアカウントをお持ちの方は、上の「Open in Colab」と書かれた青いボタンを押せば直接notebookをColabで開けます。ぜひ動かしてみてください。 過去の記事も含め、全てのコードをGithubで公開しています。 make_heap(), push_heap(), pop_heap(), sort_heap() これらの関数はC++のSTLに含まれているものですが、その有用性にもかかわらず、使い方に関する情報に乏しいです。最近、これらを深掘りしたので、知見を共有いたします。ただし、ヒープ構造に関する情報は散見されるため、ここではその点には触れず、その使い道や使い方についてColabで動く実例を交えながら解説します。 ヒープ演算は、Top Kの値の取得に使えます。Kが配列全体の長さと同じなら全ソート、短けれ
このチュートリアルでは、デスクトップアプリケーションでメッセージボックスをウィンドウ中央に表示する方法について説明します。 作成するアプリケーションの例では、ドラッグ&ドロップでファイルパスを取得する(C++)で開発したコードをパターンとして使用して、フックによってメッセージボックスをウィンドウ中央に表示します。 フックは、アプリケーションがメッセージ、マウス操作、キーストロークなどのイベントをインターセプトできるメカニズムです。特定の種類のイベントをインターセプトする関数は、フックプロシージャと呼ばれます。フックプロシージャは、受信した各イベントに対して動作し、イベントを変更または破棄できます。 ! 注意 フックは、システムが各メッセージに対して実行する必要がある処理の量を増やすため、システムの速度を低下させる傾向があります。フックは必要な場合にのみインストールし、できるだけ早く解放
実はC++はtupleクラスを使わずにタプル型やペア型の実現ができてしまいます。しかもラベル付きタプルですので、用途によってはtupleクラスよりも使い勝手は良いです。 無名構造体で代用 auto getDate() { struct { int year, month, day; } date = {2016, 12, 24}; return date; } 戻り値をauto型にしている点が肝です。値受け取りの際もautoで受け取る必要があります。 auto date = getDate(); printf("%d年", date.year); // "2016年" printf("%d月", date.month); // "12月" printf("%d日", getDate().day); // "24日" メンバ変数側のデストラクタもきちんと呼ばれますので、無名構造体側のメンバ変
目的 Visual Studio(Windows)を使ってC++のコンソールアプリケーションを開発する際、 ソースファイルの文字コード 出力するときの文字コード プログラム内で扱うデータの文字コード 全てをUTF-8で扱うための試行錯誤をまとめてみることにします。 2022/01/16 : 記事の公開当初は、ISO C++ 20 標準 (/std:c++20)(u8string)を使う予定でした。 しかし、検証した結果、ISO C++ 20 標準 (/std:c++20)は使わずにISO C++ 17 標準 (/std:c++17)を使う事にしました。 なぜならば、mbrtoc8(char -> char8_t) および c8rtomb(char8_t -> char)が実装されていないからです。 環境 Microsoft Visual Studio Community 2022 (3)
はじめに C言語から派生したオブジェクト指向プログラミング言語であるC++は、21世紀に入ってまったく別物とも言えるプログラミング言語に成長していきました。それは、Modern C++と称されています。1990年代にC++を触っていたプログラマが現在の仕様を知れば、隔世感に苛まれるのではないでしょうか。本連載では、かつてはC++をたしなんでいたという方、今からC++言語を始めるという方に向けて、Modern C++らしい言語仕様をピックアップし紹介していくことで、今のC++言語の姿を理解していただきます。 対象読者 かつてはC++をたしなんでいたという方 今からC++言語を始めるという方 モダンなプログラミング言語のパラダイムに興味のある方 必要な環境 本記事のサンプルコードは、以下の環境で動作を確認しています。 macOS Sonoma/Windows 11 Xcode Command
目次 目次 「戻り値型の後置記法」って何? 何が嬉しいの? 問題点 「戻り値型の後置記法」って何? C++11から導入された言語仕様です。 タイトルの呼び方は自分が勝手に使っているだけで、英語圏だと「trailing-return-type」がよく使われるらしい。 cpprefjp.github.io この仕様を使うと例えば以下のようなコードが int Add(int a, int b) { return a + b; } このようになります。 auto Add(int a, int b) -> int { return a + b; } 何が嬉しいの? この仕様はC++のメタプログラミングで戻り値型の推論を簡単に行う目的で使用されます。 なんだ、そんなC++上級者のための機能なんて下々の人間には関係ないじゃん、とお思いかもしれませんが、この機能にはもう一つわかりやすい大きなメリットがある
本稿では, スレッドプールの仕組みを理解して, C++を用いて, スレッドプールを自身で実装できることを目指します. 対応環境は, C++14 からを想定しています. スレッドプールは, ソフトウェアのデザインパターンの一つで, コンピュータプログラムにおいて非同期処理を実現するためのものです[1]. スレッドプールは, 同時で実行されるタスクの割り当てを待つ複数のスレッドを持ちます[1]. スレッドプールを維持することにより, すぐに終わるタスクのためにスレッドを頻繁に生成と破棄することによるオーバーヘッドを回避することができます[1]. C++ では, C++11 ~ C++20 において, 標準でスレッドプールが用意されておらず, スレッドプールを使いたい場合は, 外部のライブラリを使うか自前で実装する必要があります. スレッドプールを実現するため, 外部ライブラリをそのまま使うこと
マルチスレッドが必要になった時は、本当にそれが必要なのかどうかを考えたほうが良い。 使わなくて済むならそれに越したことはないし、現にそうやって過ごしてきたので、今さらになって10年以上前に標準ライブラリに追加されたスレッドサポートライブラリについて調べている。 正直 thread と mutex さえ使えれば何とかなるだろうと思っていたが、ライブラリの充実っぷりからして、そんなに甘い世界ではなさそうな気がしてきた。とりあえず std::future と std::promise(とその周辺)についてまとめておく。 future と promise の基本 future を一言で表現すると「そのうち値が現れる転送ボックス」といった感じになる。同様に promise を一言で表現するなら「値を入れると future に転送される箱」となるだろう。 作業スレッドからの結果を呼び出し側のスレッドで
C++11標準ライブラリのstd::future+std::promiseクラス利用に関して、不適切な使用パターンに起因するやっかいな不具合についてメモ。 この不具合はマルチスレッドプログラムの未定義動作(undefined behavior)により引き起こされる。下記例のように一見関係ないコード箇所のバグとして検出される場合もあるが、試験等でバグ検出されずに潜在化することも十分ありえる(実運用でデータ破損や突発クラッシュなどを引き起こす)。 c++ - race-condition in pthread_once()? - Stack Overflow c++ - Non-obvious lifetime issue with std::promise and std::future - Stack Overflow まとめ: (future/promiseに限らず)オブジェクトのライフ
この記事はC++アドベントカレンダー2023 25日目の記事です。ご参加の皆様お疲れ様でした! C++ Contracts C++20 Contracts 問題点とMVP(Minimum Viable Product) 最初のMVP仕様 関数の再宣言と契約注釈 引数の事後条件からの参照 契約条件式の副作用 C++26に向けたロードマップ 契約注釈のセマンティクス 違反ハンドラ 構文 C++26に向けて、残りの問題 2023年末時点でのMVP 参考文献 C++ Contracts ContractとはContract programmingの略称で、C++ ContractsとはC++における契約プログラミング機能を指す言葉です(sは付いたり付かなかったりします)。 C++ Contractsとは、契約プログラミングという考え方に基づいた設計(契約による設計)をより自然に行えるようにするため
This site contains an original, self-contained guide to learning the fundamentals of Modern C++, intended to be the basis of a self-study course. Some Chapters depend upon material presented in earlier ones, so studying them linearly is recommended. There are also regular posts (accessible from the front page) which cover topics or areas of C++ not covered in the course. If you have any queries or
この記事はSafie Engineers' Blog! Advent Calendar17日目の記事です。 はじめに こんにちは、セーフィーの画像認識エンジニアの木村(勇)です。 セーフィーのエッジAI搭載カメラで動作するアプリケーションの開発を行っています。このアプリケーションの実装ではC++が使われているのですが、サーバーとのデータやりとりでMessagePackというシリアライズの形式を使う機会が発生しました。 案外実用的な情報がなく意外と苦戦したポイントも多かったので、実際に行った手法(あまり正攻法じゃなさそうな)を共有したいと思います。 MessagePackとは 基本的にはJsonのような通信データのシリアライズの形式ですが、Jsonより早くてコンパクトです。さまざまな言語でサポートされており、それらでデータを交換することが可能となります。 導入 MessagePackはこちら
C++ Advent Calendar 2023 および Siv3D Advent Calendar 2023 18 日目の記事です。 本記事では、Visual Studio での C++ プログラミングの生産性向上に役立つ IDE の機能を、最近のバージョンで追加された無料機能を中心に紹介します。 1. コーディング用の合字フォント 日本語環境の Visual Studio のデフォルトのフォントは MS ゴシックなので、フォントにこだわりのない人は MS ゴシックを使い続けているかもしれません。英語環境では Visual Studio 2022 から Cascadia がデフォルトのフォントになっています。 Cascadia は、Microsoft が 2019 年にリリースしたコーディング用のオープンソースフォントで、合字(リガチャ)の有無に応じて Cascadia Code と C
以前も浮動小数点数の記事を書いた(作る側の気持ちで理解する浮動小数点数 - in neuro)。だがその時は、浮動小数点数に関するアイデアの説明しかしておらず、実際の「浮動小数点数(IEEE754)」については説明しなかった。今回の記事の目的は、実際の浮動小数点数についてちゃんと解説し、またいくつかの演算をビット単位で自力で書くことで、理解を深めることである。 現実の浮動小数点数 演算について書くとは言ったが、その前に少し浮動小数点数についての基本的なアイデアをおさらいしておこう。このあたりの知識は演算を理解する際にも必要になる。すでに知っている人には退屈だろうから、演算編で引っかかったときだけ見るのでも構わない。 浮動小数点数の基本的構造 浮動小数点数はその名の通り、小数点の位置が動的に変わる数である。基本的な表現方法は1.234x10-5のような指数表記と同様だ。 例えば単精度(32b
これは qiita.com の12/16の記事です。やばいもう16日が終わってしまう! はじめに 太古の昔、あるC++プログラマ*1がtemplateの再帰と特殊化を使ってコンパイル時に計算ができることを「発見」*2*3したその日から、C++とコンパイル時計算は分かちがたく結びついています。 言語機能を本来意図されていなかった方法で活用する曲芸的な技巧だったコンパイル時計算は、その強力さを買われコミュニティを席巻し、C++11での constexpr の導入によりある意味で公式に認められたものとなりました。 導入当初は return 文一つだけしか持てなかった constexpr 関数は、それでも三項演算子による条件分岐や再帰によってコンパイル時計算を大いに盛り上げました。 そしてC++14で条件分岐、ループ、変数の書き換えが、C++17ではラムダが、C++20では仮想関数と動的メモリ確保
C++ 日本語 C++ Language #define directive #include directive #line directive #pragma directive Abstract class Access specifiers Acronyms オーバーロードされた関数のアドレス Aggregate initialization Type alias alignas specifier alignof operator 代替演算子の表現 Argument-dependent lookup Arithmetic operators Array declaration ASCII Chart asm declaration Assignment operators 属性指定子シーケンス(C++11以降) attribute: assume attribute: carri
おことわり この記事で言及する C++ 規格はすべて、C++20 相当のドラフト N4861 (PDF/HTML) を基準にしています。 はじめに 私が書いている C++ プログラムでは、処理の途中経過や結果を格納するためのメモリ領域を必要に応じて再利用しています。 一般的には処理の先頭で必要なぶんのメモリを確保し、処理の末尾で解放するわけですが、メモリの確保・解放にかかるコストと処理の粒度を勘案し、再利用するほうが効率的だと判断するときがあります。 // メモリ領域を再利用するイメージ void reuse_storage() { // この記事において pointer のアドレスは各オブジェクトに必要なアライメントを満たしているとする auto pointer = operator new(1024); // メモリ領域を std::string に利用 auto str = new
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く