未分類

2024年からは、まとまってようといなかろうと積極的に記事にすることにしたので、しょうもない記事を書いてみます。

今回はC++のplacement newです。

未分類

C/C++のmemcpyは十分に最適化されており、forループする大抵のコードよりは速くなるように出来ています。しかし測り方を間違えると十分な効果を期待できません。例えばLinuxで以下のコードでは正しく測定できません。なぜだか分かりますか?

#include <chrono>
#include <iostream>
#include <cstring>

using namespace std;
using namespace std::chrono;

typedef size_t target_t;

int main(int argc, char* argv[]) {
    constexpr size_t N = 1024 * 1024 * 1024; // 1GiB

    auto src = new target_t[N/sizeof(target_t)];
    auto dst = new target_t[N/sizeof(target_t)];

    auto begin = high_resolution_clock::now();
    memcpy(dst, src, N);
    auto end = high_resolution_clock::now();

    cout << N << "bytes copy: " << N / 1024. / 1024. / duration_cast<nanoseconds>(end - begin).count() * 1000000000 << "[MiB/s]" << endl;
    return 0;
}

プログラムは正しく動きます。

$ g++ -g -O0 hoge.cpp -o hoge
$ ./hoge
1073741824bytes copy: 1560.47[MiB/s]
$

何が正しく測定できてないのでしょう?

未分類

Linux(今回はUbuntu20.04)でTUIする方法を紹介します。LinuxでGUIでなく端末操作する場合、CLIと言ったりしますが、今回はTUIです。

  • GUI: Graphical User Interface
  • CLI: Command Line Interface(和製英語だとCUIと呼ばれる)
  • TUI: Text-based User Interface

ニュアンス的にはテキストでグラフィカルなウィジェットを模したインターフェースを表現し、キーボードだけで操作していく、簡易GUI的なテキストベースのUIをTUIと呼ぶ感じです。作り的にはncursesなどを利用したアプリケーションになります。

未分類

ブラウザにソースコードを貼り付けて、各種言語をオンラインで実行する環境は多くあります。古くはJavaScriptのJSFiddleとかですが、最近だと(言語名)-playgroundみたいな名前で、公式に運用されてるケースも多いです。

今回のターゲット言語であるC++もご多分に漏れず、いくつかの環境があります。

上の2つの環境はC++のソースファイル編集がブラウザ上で出来るものの、コンパイルと実行はサーバー上で実施されます。今回はコンパイルと実行もブラウザ上で実施してみようという試みです。

未分類

C++では関数を呼び出す際の引数指定で、引数名指定ができません。例えばpythonなどは、

def func(a=1,b=2,c=3):
	print(f'{a},{b},{c}')

func(3,2,1) # 3,2,1
func() # 1,2,3
func(b=1) # 1,1,3
func(c=1,a=3) # 3,2,1

のように、いろいろな指定が出来て、3番目の例のように引数名で指定することができます。

今回はC++でなんとか近い実装を無理矢理できないか、調べてみました。なんとかそれっぽいのが部分的に出来てます(?)が、実際使うか?と言われると難しい感じの代物です。アイデアだけ役に立つこともあるかも程度の話です。

未分類

前回までに、Linuxでシステムトレイにgtkを使ってC++/pythonでアイコン表示してみたのですが、

今回はqtを使ってC++でアイコン表示してみようと思います。

未分類

Windowsなら簡単に出来そうだけど、LinuxではGUIを使う人が少ないのかそれほど多くの資料がありませんでした。LinuxのGUIは初めてなので、どんな方法があるのかもまだ分かりませんが、やってみたこと/調べたことを書き記そうかと思います。

未分類

C++はC++03までしか知らなくて、最近になってC++11以降を触っています。Ubuntu 20.04のgccは9.3なのでデフォルトだとC++14になりますが、今日はC++17で追加された std::variant を使ってみました。