タグ

C++に関するppp-labのブックマーク (88)

  • Passkey Idiom - yohhoyの日記

    他クラスに対して “メンバ関数単位でのアクセス制限” を実現するイディオム。 template <class T> class Passkey { friend T; Passkey() {} }; class A; class B; class C { public: // クラスAに対してのみ公開 void mfA(Passkey<A>, int arg); // クラスBに対してのみ公開 void mfB(Passkey<B>, int arg); }; class A { public: void f(C& c) { c.mfA({}, 1); // OK c.mfB({}, 2); // NG } }; 上記コードでPasskeyコンストラクタを= defaultでユーザ宣言すると、C++17以前ではイディオムの意図通りに動作しない。コンストラクタのprivateアクセス制限を無

    Passkey Idiom - yohhoyの日記
    ppp-lab
    ppp-lab 2024/04/11
  • C++ overload pattern - オーバーロードパターン

    オーバーロードパターン 2 Lines Of Code and 3 C++17 Features - The overload Patternという記事を見つけて,初めてオーバーロードパターンという言葉を耳にしました. 気になったので調べてみると,stack overflowにあった質問では,良く知られたパターンとあります. しかし,日語で検索してみても通常のオーバーロードが引っ掛かるばかりで日語での記事は無さそうだったのでまとめてみました.もし日語では別の名前で普及しているよ,という話があれば教えていただけると幸いです.

    C++ overload pattern - オーバーロードパターン
  • C++でEntity Component Systemを実装してみる

    はじめに CPUの進化により、データの処理速度は毎年驚異的な速度で上がっています。それに対し、データをメモリから受け取る速度はここ十数年で数倍程度にしか進化してません。 その結果、プログラムの実行時間の大部分がデータ取得の待機時間に費やされるようになってしまいました。 そこで、キャッシュメモリとCPUの特性を生かし、データ取得の待機時間を減らすことでパフォーマンスの向上を図ろうとしたのがEntityComponentSystem(ECS) です。 今回は、そんなECSをC++で実装してみたので、その基的な概念から作り方まで解説していこうと思います。 必要な前提知識 この記事はC++を前提に書いてあるので、ある程度のC++の知識があると読みやすいと思います。 また、途中でコンポーネント指向やオブジェクトプール等のデザインパターンが出てくるので、必要に応じて調べながら読んでいただけると嬉しい

    C++でEntity Component Systemを実装してみる
  • C++の高速なハッシュテーブルの実装を読んだ (ankerl::unordered_dense) - Qiita

    C++の高速なハッシュテーブル、ankerl::unordered_dense::{map, set}の実装を読んでみた。 作者によるとabsl::flat_hash_map(通称SwissTable。Google製)と同程度に挿入・検索が速く、特にイテレートはstd::vectorと同等で最速らしい。 Comprehensive C++ Hashmap Benchmarks 2022にベンチマークがある。 (作者自身による計測なので、多少のバイアスはあるかもしれない) 基のアルゴリズム Robin Hood hashing + Backward shift deletionを使用している。 まずこれを理解すると分かりやすい。 アニメーション付き Robin Hood Hashing | Programming.Guide 詳細な説明 Robin Hood hashing | Code

    C++の高速なハッシュテーブルの実装を読んだ (ankerl::unordered_dense) - Qiita
  • SEC BOOKS:ESCR C++ Ver. 2.0:【改訂版】組込みソフトウェア開発向けコーディング作法ガイド[C++言語版] Ver. 2.0 | アーカイブ | IPA 独立行政法人 情報処理推進機構

    書は、組込みソフトウェア開発向けコーディング作法ガイド[C++言語版] Ver. 1.0 (ESCR C++ Ver. 1.0) の改訂版で、C++言語を用いて開発されるソースコードの品質をより良いものとするためにコーディングの際に注意すべきことやノウハウを紹介しています。 ESCR[C言語版]のコンセプトと構造を踏襲しつつ、C++言語特有の特徴を反映して作法とルールを追加しており、組込みソフトウェアを作成するにあたって、コーディングルールを決めソースコードを標準化するのに活用いただけます。 旧版(Ver. 1.0)からの主な改訂の内容は以下の通りです。 準拠する言語規格をC++03からC++11/C++14にし、新機能に対するルールを追加しました。 C言語と共通の部分に関してESCR[C言語版]Ver. 2.0と記述を合わせました。 Ver. 1.0からの継続性、及びC言語版との整合性

    SEC BOOKS:ESCR C++ Ver. 2.0:【改訂版】組込みソフトウェア開発向けコーディング作法ガイド[C++言語版] Ver. 2.0 | アーカイブ | IPA 独立行政法人 情報処理推進機構
  • More C++ Idioms - Wikibooks, collection of open-content textbooks

    The latest reviewed version was checked on 8 September 2023. There are template/file changes awaiting review. C++ has indeed become too "expert friendly" -- Bjarne Stroustrup, The Problem with Programming, Technology Review, Nov 2006. Stroustrup's saying is true because experts are intimately familiar with the idioms in the language. With the increase in the idioms a programmer understands, the la

    More C++ Idioms - Wikibooks, collection of open-content textbooks
    ppp-lab
    ppp-lab 2022/11/17
  • トップページ | Programming Place Plus 新C++編

    トップページ ここは、Programming Place Plus の 新C++編のトップページです。C++ でのプログラミングを、入門段階から順序立てて解説していきます。 新C++編を読むにあたって、古いバージョンの C++ や、C言語の知識は不要です。 プログラミング自体の経験がない(少ない)方は、導入 から始めてください。ある程度わかっている方は、編 から始めて構いません。いずれも、目次に並べている順番で読み進めることを想定しています。 導入 編 APPENDIX リンク集 参考書籍 記号の一覧 演算子の一覧 キーワードの一覧表 型の分類表

    トップページ | Programming Place Plus 新C++編
    ppp-lab
    ppp-lab 2021/12/24
  • C++におけるinline指定子の誤解 - よーる

    C++にはinline指定子があります。しかし、このinline指定子は、その名前から誤解されがちです。 (誤解)inline指定子を付けると、その関数はインライン展開される これは誤解であり、正しくありません。正しくは、以下のような意味になります。 inline指定子を付けた場合、複数回の定義が許される。また、複数の翻訳単位*1で定義されたとしても実体は一つになることが保証される*2。 (C++14まで)inline指定子を付けた場合、コンパイラはその関数をインライン展開するヒントとすることができる。 「inline指定子を付けた場合、コンパイラはその関数をインライン展開するヒントとすることができる。」という記述はC++17以降で無くなりました。 ただし、コンパイラの最適化は見える結果が変わらない範囲で自由に行えるため、inline指定子をヒントにすることは問題ありません。(2020/0

    C++におけるinline指定子の誤解 - よーる
    ppp-lab
    ppp-lab 2021/12/23
  • 組み込みシステム上でのC++ | POSTD

    去年の10月、私が所属している 会社 の部署で、組み込みファームウェアの開発をC言語からC++に切り替えました。C++のクラス、リソースの自動クリーンアップ、パラメータ多相、そして強化された型安全性などは、汎用OSをデスクトップ機で稼働している時と同様、リアルタイムOS(RTOS)やベアメタル上でも便利です。C++を使えば、安全で表現豊かなファームウェアを書くことができます。 しかしC++のこの自動的な魔法は諸刃の剣とも言えます。いくつかの機能は、組み込み環境 ^(1) には搭載したくないシステムのファシリティに依存するからです。ツールチェーン周りをどうするかも厄介です。 memcpy やアトミック操作、ハードウェア固有の浮動小数点関数などの重要なファシリティが提供されるので、 libgcc と libstdc++ を完全に破棄するのではなく、特定の部分を避けて使わなくてはなりません。 こ

    組み込みシステム上でのC++ | POSTD
  • Learn Contemporary C++ | Concise&Visual Examples

    Learn up-to-date, idiomatic C++ with code examples, concise explanations, cheat sheets and infographics. -- Lerne aktuelles, idiomatisches C++ mit Code-Beispielen, knappen Erklärungen und Infografiken. -- 学现代的C++ // 代码示例,简洁的说明和图表

    Learn Contemporary C++ | Concise&Visual Examples
    ppp-lab
    ppp-lab 2021/09/30
  • std::set を高速にマージする - Qiita

    前提 std::set に、多数のソート済みアイテムをできるだけ高速に追加したい。 具体的には、std::set<std::string> で要素数は 100000 くらい、各要素の文字数は多くて 128 程度、というような状況を想定している。 std::set へのコンテナのマージの一番典型的な手順は std::set::insert() の iterator を取るバージョンだと思われるが、こいつは追加される要素群がソートされていないことを前提としているので、必要以上に要素の比較が入ってしまう。 C++17 で std::set_union というものが追加されている。こいつはソート済みの 2 つのコンテナをマージしつつ第三のコンテナへ追加するという挙動を取る。元となる 2 つのコンテナは変更されず、出力先のコンテナへは各要素のコピーが追加されることになる。 これで済む状況も多いと思わ

    std::set を高速にマージする - Qiita
    ppp-lab
    ppp-lab 2021/08/25
  • 結局僕たちは intptr_t 同士を演算させても良いのか - 進捗置き場というわけでもない場所

    C++ において intptr_t 同士の演算がどの程度許可されているのか気になって調べたら意外な事が見つかったのでメモ。 記事中の C++ 規格は 2020/08/09 現在の C++20 の最終 WD である N4861 を参照しています。 intptr_t の定義 そもそも intptr_t や uintptr_t はどう定義されているのか確認しましょう。C++ の規格においてはこれらの型は <cstdint> ヘッダの中に定義される適当な符号付き/符号なし整数型の using であって、コンパイラが実装するかは optional であるとだけ述べられており、その詳細は C ISO 7.20 を参照せよとぶん投げられています。仕方なく C11 の規格を参照し、§7.20.1.4 を読むと intptr_t について The following type (引用注:intptr_tのこ

    結局僕たちは intptr_t 同士を演算させても良いのか - 進捗置き場というわけでもない場所
    ppp-lab
    ppp-lab 2021/02/11
  • [C++]inline名前空間の使途 - 地面を見下ろす少年の足蹴にされる私

    inline名前空間はC++11から追加された機能で、その中にあるものは透過的に(名前空間がないかのように)アクセスすることができます。一見使いどころがなく見られがちですが、うまく使えばとても便利に活用することができます。 1. using namespaceの範囲を限定する 2. APIのバージョニング 3. ABIのバージョニング リンクエラーにする ABI互換性を確保する 4. 名前の衝突を回避する 参考文献 1. using namespaceの範囲を限定する これは標準ライブラリではユーザー定義リテラルの定義と利用でよく利用されます。 例えば、std::string_viewを簡易利用するためのsvリテラルは次のように宣言されています。 namespace std { // string_viewtemplate <class CharT, class Traits = c

    [C++]inline名前空間の使途 - 地面を見下ろす少年の足蹴にされる私
    ppp-lab
    ppp-lab 2020/11/23
  • __VA_ARGS__の引数をループするやつはなぜ動くのか - in neuro

    今更マクロの話です。求められてるのはそういうのではなくモダンな解決方法の話だということは知っているけれど、例えばreflection TSとかは紹介するには重すぎるので……。まあとりあえず今回は伝統的なテクニックの話をします。他所でも解説されている可能性は高いけれど、同じ解説というものは二つは生まれないものだろうから気にせず書こう。 可変引数マクロ C99(C++11)から可変引数マクロというのが入った。簡単にいうと任意個の引数を取れるマクロだ。#define MACRO(x, y, ...)のように定義する。 __VA_ARGS__というのはこの可変引数マクロで使うもので、展開した時の...の中身が入っている。これを使うと、以下のようなマクロが書ける。 #define DEBUG_PRINT(fmt, ...) \ printf("at line %d: " fmt, __LINE__,

    __VA_ARGS__の引数をループするやつはなぜ動くのか - in neuro
    ppp-lab
    ppp-lab 2020/11/12
  • C++ Core Guidelines

    C++ Core Guidelines May 11, 2024 Editors: Bjarne Stroustrup Herb Sutter This is a living document under continuous improvement. Had it been an open-source (code) project, this would have been release 0.8. Copying, use, modification, and creation of derivative works from this project is licensed under an MIT-style license. Contributing to this project requires agreeing to a Contributor License. See

    ppp-lab
    ppp-lab 2019/12/30
  • Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source projects. As every C++ programmer knows, the language has many powerful features, but this power brings with it complexity, which in turn can make code more bug-prone and harder to read and maintain. The goal of this guide is to manage this complexity by describing in detail the dos and don'ts of writing C

    ppp-lab
    ppp-lab 2019/12/24
  • C++で効率よく重複のない乱数列を生成する - Qiita

    更新記録 2015/9/30: select方式を追加した結果、結論が大きく変わりました 2015/10/1: @nmby さんの助言を受けて、selectの正式名「Fisher-Yates法」を追記し、unordered_mapを併用した方法もさらに比較しました。 2015/10/3: より細かい区切りで所要時間を計算したところ、shuffleが速くなる場合が出てきたため、一部記述を修正しました。 概要 C++で重複のない乱数列(整数)を生成する方法を、いくつか比較してみました。結果、 1. 必要な乱数の数が、乱数範囲に比べて比較的少ない場合、std::vectorに乱数を生成し、std::sortとstd::uniqueを適用するのが、重複しない乱数列を最も速く生成できる。 2. 必要な乱数の数が、乱数範囲に比べて比較的多い場合(手元の環境だと、生成したい乱数範囲中の整数のおおよそ10

    C++で効率よく重複のない乱数列を生成する - Qiita
    ppp-lab
    ppp-lab 2019/09/05
  • ループ、再帰、gotoを使わずに1から100までを印字するC++プログラムは書けますか?

    回答 (11件中の1件目) 追記 再帰のルールをよく理解してませんでした。 分かりやすい例として載せておきます。 [code]#include template struct print { print() { std::cout << N << std::endl; } }; template struct Print { Print() { Print(); print(); } }; template<> struct Print<0> { Print() {} ...

    ループ、再帰、gotoを使わずに1から100までを印字するC++プログラムは書けますか?
  • 組み込み屋こそC++を使うべきなのです - プログラムdeタマゴ

    やーやーやー。なんとワタクシ、遂に脱8bitしました!ワーワー、ドンドンパチパチ! さて、組み込みでもRustがアツかったり色々しますね。ただまぁ、Rustってサポートや車載対応等が無いので、政治的ごにょごにょでちょっと使いにくいですよね。 だから、今まで通りC言語………って決めてしまう前に、ちょっと待って、まだ選択肢有るじゃない。 そう、C++ですよ! 新しい言語とか無理 安心してください。C++は昭和の言語です(1983年)。昭和ですよ、ショーワ。世界大戦があった時代の言語です。今は令和ですよ。断言しますが、この記事書いてる現在、令和生まれの若い子って、昭和とかもう知らないですよ。古すぎるといって過言ではありません。 そうじゃない オブジェクト指向とか無理 安心してください。C++はオブジェクト指向言語ではありません。C++は 魔留血原太武言語 組み込み屋向けに嬉しい機能がいっぱいある

  • Hidden Friends - yohhoyの日記

    プログラミング言語C++におけるライブラリ設計で「ADL(Argument Dependent Lookup)経由でのみ呼び出し可能な非メンバ関数/演算子オーバーロード 定義」を実現するテクニック。 2019-12-03追記:2019年11月会合にて (PDF)P1965R0 が採択され、C++標準規格上の用語(term)として "hidden friends" への言及が明記された。 下記説明コードのみではメリットがわかりづらいが、非メンバ関数インタフェース追加による名前空間汚染の抑止と、プログラマが意図しない関数呼び出しによるトラブル回避が主目的。 namespace NS1 { struct C { /*...*/ }; // 非メンバ begin/end 関数 inline C::iterator begin(C& c) { return c.begin(); } inline C

    Hidden Friends - yohhoyの日記
    ppp-lab
    ppp-lab 2019/06/01