Some days ago I noticed that on a Mac, doing snprintf calls from multiple threads shows curious lack of scaling (see tweet). Replacing snprintf with {fmt} library can speed up the OBJ exporter in Blender 3.2 by 3-4 times. This could have been the end of the story, filed under a “eh, sprintf is bad!” drawer, but I started to wonder why it shows this lack of scaling. Test case A simple test: convert
この記事はC++アドベントカレンダー2021の記事です。 qiita.com 小ネタですが今日の分が埋まっていなかったので。 std::source_locationとは std::source_locationは、その名の通りソースコード中の位置を表す情報が入った構造体です。C++20以降で使うことができ、<source_location>で定義されています。 https://cpprefjp.github.io/reference/source_location/source_location.html __FILE__や__LINE__のモダンないいかんじのバージョンだ、という認識でだいたいOKです。 この構造体は普通、std::source_location::current()で作ります。この関数は呼ばれた位置を示すstd::source_locationを返します。デフォルトコ
“こんなゾンビだらけの言語に居られるか!俺は他の言語に出て行くぜ!” -- 行方知れずのプログラマー 🧟Zombie Names📛 C++17標準ライブラリ仕様から「Zombie names」というセクションが追加され、過去バージョンで利用していた識別子(クラス名や関数名など)が予約済みとして列挙されるようになりました。1 ...嘘じゃないよ:https://eel.is/c++draft/zombie.names C互換ライブラリ[C++11で非推奨, C++14で削除] gets バッファオーバーラン脆弱性につながるため、今すぐ利用停止してください。バッファサイズを明示指定するfgets関数で代替可能です。 スマートポインタauto_ptr<T>[C++11で非推奨, C++17で削除] auto_ptr auto_ptr_ref C++11以降はunique_ptrクラスで代替可
22:22 21/11/20 ボレロ村上(村上原野)さんと constexpr のこと 去る2020年2月、縄文陶芸家にしてC++プログラマという希有な二つの顔を持つ人物がこの世を去りました。 ボレロ村上 (村上原野) 氏です。 正直なところ、陶芸家としての彼の側面については私はほとんど何も知らないに等しいです。 残された作品を見て何かを語れるほど芸術に通じているわけでもありません。 いつか機会があれば見に行こうと思っていた村上さんの作品を目にする最初の機会も、 昨年訪れた追悼展になってしまいました。 ただ、それでも私は、彼自身の登壇発表の資料 であったり、 そして何よりも縄文・陶芸に造詣の深い方々の記された幾つかの文章によって、 彼が一体何を成し遂げたのか、成し遂げようとしていたのかに触れることができています。 この夏にはクラウドファンディングで 作品集 も出版され、誰でも手にとって縄文
次期C++2b(C++23)言語仕様に追加される Deducing this により、自己再帰するラムダ式を自然に記述できるようになる。 ラムダ式の第1引数型this autoで宣言されるselfは explicit object parameter と呼ばれ、ここではラムダ式自身のクロージャ型(closure type)へ推論される。パラメータ名は任意だが、PythonやRustなど他言語の流儀にならった方が無難。 // C++2b(P0847R7より引用) auto fact = [](this auto self, int n) -> int { return (n <= 1) ? 1 : n * self(n-1); }; std::cout << fact(5); // "120" C++14/17/20 C++14/17/20ではジェネリックラムダ式を利用してラムダ式の自己再帰
1. 概要 C++11 から導入されているスマートポインタ(unique_ptr, shared_ptrなど) のメモリ管理の仕組みについて調べたことをまとめています。スマートポインタでは、new/deleteの関係ように自分で意図的に delete をしなくても、その変数の生存範囲(スコープ)が終わったタイミングで自動で破棄されるため、動的に確保されたメモリのメモリリークを防ぐことが出来ます。 ここではスマートポインタ自体の前提知識について説明しませんが、C++11スマートポインタ入門が非常に良くまとまっているため、必要があればこれを読むことをお勧めします。 また、ソフトウェアデザイン 2021年9月号でも、C/C++のメモリ管理について概要が少しだけ説明されています。 2. 参照先が誰も居なくなった時点でメモリ解放 スマートポインタの場合、その変数を参照する人が誰も居なくなった時点で自
若干釣りタイトルですが,私が「Rust にはない C++ の良さ」を募ったところ,12 個ほどの優れている点が報告されたので,まとめてみます. 背景 私は 2018/10/08 開催予定の技術書典5で,『C++でできる!OS自作入門』と題して,Clang+LLD で C++ を使って OS 開発する際の注意点とか C++ の活用例を解説する同人誌を書こうと思っています. その下調べもかねて,このようなツイートをしました. C++好きな人!ぜひ,RustにはないC++の良さを教えてください!— C++でOS自作 技術書典5 お05 (@uchan_nos) 2018年8月24日 そうしたら知り合いからこんなリプが飛んできました. これ、まとめてblogにして!— shoma (@shoma) 2018年8月24日 一部の人に参考になるかもしれないのでまとめることにしました.ただしネタ多めです
C++20 introduces concepts as a way to write powerful self-documenting templates. At their core, concepts are logical binary expressions that can be used to constrain the template parameters of any class or function template. These logical expressions are evaluated at compile time to determine whether the template parameters satisfy the given constraints. The purpose of this tutorial is to be a def
はじめに 以前リンカのお仕事という記事を書きました。関数やグローバル変数のアドレスは、コンパイル時にはとりあえずラベルとして定義され、そのアドレスはリンク時にリンカが決めます。その際、リンクの順番によりアドレスが変わります。その結果、リンクの順番により実行結果が変わるようなコードが書けます。それについてちょっとだけ説明しようと思います。 グローバル変数 関数の外で宣言された変数はグローバル変数となります。何も指定しなければ、それはグローバルシンボルとなり、別のファイルからもアクセスできます。コンパイラに「実体が別のオブジェクトファイルにあるよ」と教えるにはextern宣言を使います。 main.cpp #include <cstdio> extern int a, b; int main() { printf("a: %p\n", &a); printf("b: %p\n", &b); }
これはC++アドベントカレンダーが埋まっていなかったので急遽書こうと思い立って急いで寝る前にバーっと書いてたら気づいたときには2時を回っていた記事です。何かあったら教えるか見逃してください。 そもそも何の話? Static Initialization Order Fiascoとは、異なる翻訳単位で初期化される static storage duration を持つ変数の初期化順序が不定であるために起きる問題の名称です。ちなみに"fiasco"は、weblioによると「(野心的な企てがこっけいな結果で終わるような)大失敗」のことで、イタリア語の「瓶」が語源だそうです。ガラス製品作りに失敗した材料で瓶を作ったことからだとか。おしゃれな言い回しをしますね。問題自体は深刻なんですが。 どういう問題なのか順に説明していきましょう。まずstatic storage durationを持つ変数とは何ぞ
C++20 RangesライブラリのRangeとViewとconst修飾の関係についてメモ。 まとめ: 対象Rangeのconst修飾(要素の変更可否)と、Viewのconst修飾(const-iterableの可否)は異なる概念である。 C++20標準ライブラリ提供の一部Rangeアダプタでは、const修飾によりViewとして機能しなくなるものがある。 具体例:std::views::filter, std::views::drop_while Viewを受け取るパラメータでは不用意にconst修飾を行わないこと。 Viewは定義上「軽量にコピー/ムーブ」されるオブジェクトのため、パラメータ型は非constな値型とすればよい。 下記コードのようにViewをconst修飾しても、対象Range要素がconst修飾されていなければ要素値を書き換え可能。要素書き換えから保護するには、対象Ra
次期C++2b(C++23) Rangesライブラリstd::views::splitとstd::string_viewを利用した文字列分割処理。 C++標準ライブラリのアップデートによりC++20時点よりシンプルに記述可能となり、またstd::stringを介さないため実行効率改善も見込める。 // C++2b(C++23) #include <iomanip> #include <iostream> #include <string_view> #include <ranges> int main() { std::string_view s = "apple,banana,cinnamon"; for (auto word : s | std::views::split(',')) { std::cout << std::quoted(std::string_view(word))
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く