Tags

16 ページ目

C++

AI はデモの作成が速く、修正作業も本当に速いです。

最近AIを使ってC++の小規模なプロジェクトを立ち上げたんだけど、一番「やられる」瞬間は、それがコードを書いてくれないことじゃなくて、たった3分でそれっぽくディレクトリツリーを組み立ててくれて、ついでにサードパーティライブラリをいくつか突っ込んで、デモが本当に動く時なんだよね。問題もそこにある。新しく導入したライブラリが具体的に何に対応しているのか、コンパイルのパスはどうなるのか、どこに境界線があるのか、まだ把握できていないのに、後で手戻りが発生するのはほぼ避けられない。

最近、AIプログラミングで最も怖いのはモデルの賢さではなく、最初からやりすぎなところだと感じています。特にC++のような、しっかりしたフレームワーク(脚手架)に頼れない言語の場合、手順を一つ間違えるだけで、コンパイル、リンク、ライブラリのバージョン、ディレクトリ構造など、後でいくつもの手間が増えてしまいます。

VS CodeでC++を扱う際は、CMakeとGDB Printerを忘れないように。

以前VS CodeでC++をデバッグするとき、設定は基本的にlaunch.jsonに留まっていて、せいぜいGDBの行を追加する程度でした。 programを埋めて、gdbを埋めて、ブレークポイントを設定する。それで終わり?毎回デバッグ前にターミナルで手動でcmake --buildしないといけませんでした。 さらに面倒なのは、カスタム価格、契約、注文タイプなどでブレークポイントを打った後、VS Codeのデバッグウィンドウには内部フィールドが大量に表示されるだけで、データ自体は正しいのですが、人間が理解できる言葉になっていない点です。 この件がおかしいと思う点は、以前見たチュートリアルもlaunch.jsonまでしか触れていなかったことです。最近AIに新しいプロジェクトの設定を依頼したところ、なんと自動でpreLaunchTaskgdb_printers.pyを追加してくれたので、「VS CodeでC++をデバッグするって、ただGDBを起動させるだけじゃないんだな」と気づきました。デバッグ前にCMakeのコンパイルを自動実行できるし、ブレークポイントで停止した後に、GDBにPythonスクリプトをロードさせて、ビジネスロジックの型を自分が見やすい形に整形させられるんです。 正直なところ、これは何かの「裏ワザ」というわけではありません。 しかし、C++の日常的なデバッグにおける非常に面倒な2つの空白部分――起動前のビルドブレークポイント後の変数表示――を完璧に埋めてくれたのです。

フォルダの階層構造に名前空間を重ねる、これは一体何と呼ばれますか?

最近アルゴリズムサービスを書いていて、twapvwap のようなモジュールをいくつか展開したところ、またこの古い問題に直面しました。

C++ でクラス名に頼ってセマンティクスを無理やり押し付けると、名前はすぐに制御不能になります。TwapOrderManagerVwapOrderManagerAlgoOrderManager のようなものは、書き進めているうちに「自分の構造が手に負えないことはわかっているけど、とりあえずプレフィックスを付け足しておこう」という感じになってしまいます。端的に言えば、フォルダで階層分けをして、さらに namespace を一つ追加するのは、コードの潔癖症なのではなく、C++ に Java のようなネイティブな package システムがないことによる空隙を埋めているのです。

深層解析:C++ における `static lambda` が引き起こすメモリリークとキャッシュ汚染

本記事では、C++開発における unordered_map::find がヒットした後にオブジェクトフィールドが一致しないという奇妙な現象を分析しています。原因は、関数内部で static lambda を定義し、参照キャプチャによってローカル変数を捕捉することです。これにより、最初の呼び出し後には幽霊参照が発生し、その後の呼び出しで未定義動作(UB)を引き起こし、キャッシュデータを汚染します。この問題を解決するには、明示的なパラメータの渡しを介して暗黙のキャプチャを置き換え、ライフサイクルの管理を標準化し、Sanitizerツールを使用することを推奨します。

マシン間計算の時間差 (Mashinkan tenkiho no jikanusa)

既存のグループ内通信プロトコルでは、steady_clock をタイムスタンプとして使用し、個々のノードの処理時間(レイテンシー)を計算しています。特定の特殊な状況において、メッセージパケット自身のタイムスタンプを使用しましたが、その自身のもつタイムスタンプは他のマシンから取得されており、結果的に計算されたレイテンシーが異常に大きくなってしまいました。

メモリレイアウトとバイナリ互換性

C++ Linux サービスでクラッシュが発生しました。そのサービスは、ある静的ライブラリを使用してコンパイルされています。 静的ライブラリが変更され、ヘッダーファイルにメンバー変数が追加され、静的なバイナリライブラリが再リリースされました。 サービスは新しいバイナリライブラリに依存しており、正常にコンパイル・実行されますがクラッシュします。クラッシュ箇所は明らかに問題ありません。以前のコンパイラアップグレード時の未定義動作や、信頼できないスタックトレースと類似しています。 サービスを再コンパイルする際に、依存するヘッダーファイルを更新することで、正常にビルドおよび実行できるようになりました。 これはなぜ発生したのか、どのようなコンピュータ知識が関係しているのかを詳しく説明します。メモリレイアウトに関連していると推測し、具体的な例を用いて詳細に説明します。

C++ ビット演算の基礎:ビットごとのANDとフラグ設定

実際のC++開発において、ビット演算は一般的な技術であり、特にシステムの状態、フラグビット、または制御ビットを扱う際に、ビット演算は非常に効率的な解決策を提供します。本稿では、例を通して、ビット演算を使用して特定のフラグビットを取得および設定する方法について解説します。