質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

8964閲覧

C++ dllのメモリ領域について

tamina

総合スコア136

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/03 08:41

ただいまC++の勉強をしています。
そこで、dll側のグローバル変数をexe側で共有し、利用しようと思っています。

ただ、そこで疑問が出てきたのですが、
dllをexeが読み込む場合、dllの情報はヒープ領域に割り当てられるのでしょうか?

また、dll内で定義されたグローバル変数は、dll用に確保したヒープ領域内で
静的領域 的な場所を作って定義するのでしょうか?

通常ではC++のプログラムは以下のように配置されるようです。
データ領域:???
静的領域:グローバル変数など
スタック領域:関数内のローカル変数など
ヒープ領域:newなどを使って動的に確保された変数など

すみません、分かる方がいましたら教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/04 01:15 編集

https://snoozy.hatenablog.com/entry/2020/01/20/033114 DLLのロードを解説している記事ですが、これを見た感じでは普通にヒープに配置されてそうですが、グローバル変数を使用するより、メモリマップトファイル辺りを使用した方が良いのではないでしょうか。
guest

回答3

0

dll側のグローバル変数をexe側で共有し、利用しようと思っています。

実現したいのは、下記のような処理でしょうか?この通りであれば、C++言語のドメイン知識はほぼ無関係です。

  • 共有ライブラリ(dll)内部で「グローバル変数」を定義。
  • 2つ以上の異なるプロセス(exe)からこの共有ライブラリをリンクし、プロセスを跨いだ「グローバル変数」の共有を行いたい。

Windows OSプロセス/共有ライブラリに固有のドメイン知識が必要となります。実装方法は、記事「同一のDLLを使用しているアプリ同士で、データの共有をする方法」を参照ください。


dllをexeが読み込む場合、dllの情報はヒープ領域に割り当てられるのでしょうか?
dll内で定義されたグローバル変数は、dll用に確保したヒープ領域内で静的領域的な場所を作って定義するのでしょうか?

実行可能なアセンブリコードを格納する領域と、静的変数などのデータ格納領域は区別されます。プログラム実行中に動的確保されるヒープメモリ領域は、これらとはまた別に存在します。

C++言語におけるグローバル変数は、通常は プロセス単位に独立した「データ格納領域」に配置されます。先記事の実現方式(下記引用)では、プロセス横断的に共有されるセクション.sharedを用意し、グローバル変数aがその特別な.shared共有セクションに配置されるようリンカに指示しています。

c++

1// WindowsOS固有コード 2#pragma comment( linker, "/SECTION:.shared,RWS" ) 3#pragma data_seg( ".shared" ) 4extern int a = 0; 5#pragma data_seg()

投稿2020/12/04 08:15

編集2020/12/04 08:20
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

DLL は EXE と干渉しない位置に配置されます。 EXE と各 DLL はそれぞれ自分用の場所を持っています。 しかしスタックとヒープは基本的に共有です。

実態は複雑なので正確な理解をするのはかなり難しいのですが……。 (わたしもそんなに深いところまではわかっていないと思います。) 定番の参考書としては Linkers & loaders をオススメします。

投稿2020/12/03 09:33

SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamina

2020/12/08 07:51

正確な理解は難しいことが、他の回答者さんからの返信も合わせて理解できました。 参考文献まで載せて頂いてありがとうございます。 是非読んでみようと思います。
guest

0

これはメモリ領域だけでなくプロセス管理の話になります

これは言語だけでなくOSの知識が必要になります。

単純な分割コンパイル時における変数共有課題とは意味が違います。

投稿2020/12/03 14:43

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問