タグ

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

  • C++のグローバル静的変数の初期化とattribute/declspecによる関数の呼び出し順序の制御

    初めに C++ではグローバルな静的変数が宣言されているとmainの前に初期化されます。 GCCには__attribute__((constructor))という拡張があり、この属性を関数の前に付けるとその関数がmainの前に呼ばれます。 それでは両方使うとどういう順序でなるのか? C++的には未定義ですが実験してみました。 単一ファイルにおける順序 #include <stdio.h> static struct X1 { X1() { puts("X1 cstr"); } } x1; static void __attribute__((constructor)) initMain() { puts("initMain"); } static struct X2 { X2() { puts("X2 cstr"); } } x2; int main() { puts("main"); }

    C++のグローバル静的変数の初期化とattribute/declspecによる関数の呼び出し順序の制御
  • C/C++の「ポインタ」とは

    C/C++ の「ポインタ」は、難しいとか、実は簡単だとか、色々言われます。 ポインタについては規格に書かれています。この記事は、ポインタをより正確にイメージするため、規格に私の解釈を追加したものです。区別のため、C++23 草案 (N4950) の内容には節番号を付け、私の解釈は 斜体 で書きます。 私の解釈は以下の記事の影響を受けています。 ポインタとは、IDとオフセットの組 まず、ヌル以外のポインタは、以下の ID とオフセットの組 です。 ID:新しいオブジェクトが作られるたびに振られる、ユニークな値。 オフセット:オブジェクト先頭からのバイト数。 詳しく話していきます。 ID の割り振り 変数を定義するとオブジェクトが作られ (6.7.2)、各オブジェクトに固有の ID が割り振られます。たとえば、 と書くと整数 x と配列 arr が作られるので、x と arr にそれぞれ ID

    C/C++の「ポインタ」とは
    ppp-lab
    ppp-lab 2025/01/04
  • return文におけるstd::moveについて

    return文でstd::moveをいつ使うべきかとその理由を完全理解してください💪

    return文におけるstd::moveについて
    ppp-lab
    ppp-lab 2024/12/21
  • C++ で [[lifetimebound]] 属性を用いてダングリング参照の発生リスクを軽減する

    C++ Advent Calendar 2024, 8 日目の記事です。 English ポイント 近年の C++ コンパイラでは、ダングリング参照(ライフタイムが終了したオブジェクトへの参照)の検出が強化されつつある。 一部のコンパイラでは、コンパイラ拡張 [[lifetimebound]] 属性を用いることで、特定のケースにおけるダングリング参照をコンパイル時に検出できる。 この機能によってすべてのダングリング参照を防げるわけではないが、ライブラリ作者が [[lifetimebound]] を適切な関数やコンストラクタに付与することで、ユーザコードにおけるダングリング参照の発生リスクを軽減できる。 1. 概要 GCC 13 以降では、新たに導入された -Wdangling-reference 警告によって、一時オブジェクトのライフタイムに関連するダングリング参照の問題を検出できるように

    C++ で [[lifetimebound]] 属性を用いてダングリング参照の発生リスクを軽減する
    ppp-lab
    ppp-lab 2024/12/09
  • 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

    m_bucketsがハッシュテーブルの管理データで、m_valuesが格納した要素の配列。 m_valuesは全要素が隙間なく詰められていて、イテレートする際はここを直接走査する。 dist_and_fingerprintは、名前の通り2つの値が一つの変数にパックされている。 この工夫で、いろいろと効率よく処理できる(後述) 上位3バイト: dist ハッシュ関数で求めた位置から、実際に要素が格納されている位置までの距離 基アルゴリズムの解説でProbe Sequence Lengthと呼ばれているものと同じ 1から数えるので注意。つまりdist == 1ならハッシュ関数で求めた位置と実際に格納されている位置が等しい 下位1バイト: fingerprint ハッシュ値の下位1バイトを格納 dist_and_fingerprint == 0の場合はEmpty(その位置に要素が格納されていな

    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 9 November 2024. 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 lan

    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 Oct 3, 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