[解決済み】__attribute__((constructor))は具体的にどのように機能するのですか?
2022-04-30 23:58:47
質問
設定することになっているのは間違いなさそうですね。
- 具体的にはいつ実行されるのですか?
- なぜ括弧が2つあるのですか?
-
は
__attribute__
関数ですか?マクロか?シンタックス? - これはC言語で動作しますか?C++?
- 動作させる関数は静的である必要がありますか?
-
というのは
__attribute__((destructor))
を実行しますか?
__attribute__((constructor))
static void initialize_navigationBarImages() {
navigationBarImages = [[NSMutableDictionary alloc] init];
}
__attribute__((destructor))
static void destroy_navigationBarImages() {
[navigationBarImages release];
}
解決方法は?
- 共有ライブラリがロードされたときに実行されます。通常はプログラムの起動時に実行されます。
- GCCの属性はすべてそうなっています。おそらく、関数呼び出しと区別するためでしょう。
- GCC特有の構文です。
- はい、これはCとC++で動作します。
- いいえ、この関数は静的である必要はありません。
- デストラクタは、共有ライブラリがアンロードされたとき(通常はプログラムの終了時)に実行されます。
つまり、コンストラクタとデストラクタが機能する方法は、共有オブジェクト ファイルに特別なセクション (ELF では .ctors と .dtors) があり、そこにはそれぞれコンストラクタとデストラクタの属性が付いた関数への参照が含まれているということです。ライブラリのロード/アンロード時にダイナミックローダプログラム(ld.soなど)がそのようなセクションが存在するかどうかをチェックし、存在する場合はそこで参照される関数を呼び出します。
そういえば、通常のスタティック・リンカーにも似たようなマジックがあり、ユーザーがスタティック・リンクとダイナミック・リンクのどちらを選択しても、起動時やシャットダウン時に同じコードが実行されるようになっているはずです。
関連
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] C言語で純粋にiOSアプリを書く方法