タグ

2021年8月3日のブックマーク (3件)

  • 実行結果がリンクの順番に依存するコード

    はじめに 以前リンカのお仕事という記事を書きました。関数やグローバル変数のアドレスは、コンパイル時にはとりあえずラベルとして定義され、そのアドレスはリンク時にリンカが決めます。その際、リンクの順番によりアドレスが変わります。その結果、リンクの順番により実行結果が変わるようなコードが書けます。それについてちょっとだけ説明しようと思います。 グローバル変数 関数の外で宣言された変数はグローバル変数となります。何も指定しなければ、それはグローバルシンボルとなり、別のファイルからもアクセスできます。コンパイラに「実体が別のオブジェクトファイルにあるよ」と教えるにはextern宣言を使います。 main.cpp #include <cstdio> extern int a, b; int main() { printf("a: %p\n", &a); printf("b: %p\n", &b); }

    実行結果がリンクの順番に依存するコード
  • Static Initialization Order Fiasco - in neuro

    これはC++アドベントカレンダーが埋まっていなかったので急遽書こうと思い立って急いで寝る前にバーっと書いてたら気づいたときには2時を回っていた記事です。何かあったら教えるか見逃してください。 そもそも何の話? Static Initialization Order Fiascoとは、異なる翻訳単位で初期化される static storage duration を持つ変数の初期化順序が不定であるために起きる問題の名称です。ちなみに"fiasco"は、weblioによると「(野心的な企てがこっけいな結果で終わるような)大失敗」のことで、イタリア語の「瓶」が語源だそうです。ガラス製品作りに失敗した材料で瓶を作ったことからだとか。おしゃれな言い回しをしますね。問題自体は深刻なんですが。 どういう問題なのか順に説明していきましょう。まずstatic storage durationを持つ変数とは何ぞ

    Static Initialization Order Fiasco - in neuro
  • 並行プログラミング入門

    複数のプログラムを同時に実行する「並行プログラミング」は、処理速度を飛躍的に向上させる手法で、タスク管理、プロセス管理、スレッド管理をはじめ、複雑な仕組みについての幅広い知識とテクニックが必要となります。書はRustとアセンブリ、そして一部Cを用い、CPUのアトミック命令、グリーンスレッド、アクターモデル、π計算、ソフトウェア・トランザクショナルメモリ、async/awaitなど、並行プログラミングに関する理論的な背景から実装までをカバー。さらに、アセンブリ実装の理解を深めるため、AArch64とx86-64アーキテクチャの説明も付録として収録。一歩一歩、着実に理解できるように、その仕組みから順を追って詳しく説明します。GitHub上で公開されているソースコードを実際に動かしながら、並行プログラミングの知識と理解を深めることができます。 関連ファイル サンプルコード 正誤表 ここで紹介す

    並行プログラミング入門