スタック領域について – 固定ページ 3 – プログラミング – Home

通知
すべてクリア

[解決済] スタック領域について

固定ページ 3 / 3

Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

VC7.1は実際に試して可能で
した。
特に意識せず使ってましたが

怒られた記憶もないので、
VC6やGCC、BCC等でも通る
と思います。
#逆に怒られるコンパイラを
知らないかも


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

VC6でも普通に通ります。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

↑実際にやってみました。

> 最新のC言語では構造体も値返しできるのですか。
最新(C99)でなく、C89とかでも通るはずです。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>2006/01/10(火) 10:25:31 
のPATIOさんご意見で、「ヒープ領域から取得する」というお話がありました。

僕が参考に示した、
Windows CE .NET の高度なメモリ管理
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/jpdnce/htm/advmemmgmt.asp
に、Windows CEでのヒープメモリーの使い方が書かれています。
規模の大きな構造体は、ヒープからとることが出来ないのでしょうか。

構造体を、ポインターにして引数として渡してあげれば、その関数の中で値を書換え可能
だと思いますが、どうでしょうか。
わざわざ戻り値をしなくてもいいような気がします。


返信引用
ミミ
 ミミ
(@ミミ)
ゲスト
結合: 24年前
投稿: 63
Topic starter  

Ban様、PATIO様、ITO様、ご返信ありがとうございます。

特に、実際に戻り値が構造体の時の動作検証まで行っていただいた Ban様には
何とお礼を申し上げたらよいか・・。本当にありがとうございます。

自分も(戻り値が構造体)VC6で試してみましたが、
特に警告も表示されずに実行できました。
# PCのスタック域(1MB)は CE(58KB)と比較すると大きいとはいえ、
# 構造体分の大きさを消費していることには変わりありませんが・・。

一方で、ITO様のご指摘、仰るとおりです。

>【ミミ 2006/01/17(火) 00:51:34】
>この回避方法として、★1ではローカル変数(スタック)ではなく、メンバ変数(ヒープ)
>として確保し、Func1()、Func2()も MY_TABLE 型のポインタでやりとりしようと考えていま
す。

現在は、構造体を戻り値とする仕様をやめ、ヒープに予め確保した領域に対して
参照渡しでやりとりをするように修正いたしました。
これにより「無名の一時変数」によって無駄に消費していたスタック領域も、
抑える事ができました。
今後は、CEならではのスタックの制限について常に考え、開発を進めていこうと思っています。

>【ITO様 2006/01/14(土) 19:52:20】
ITO様の提示してくださいました2つのリンクのうちの「Windows CE .NET の高度なメモリ管
理」
ですが、今後時間をかけてじっくり読んでいこうと考えています。
今後も CEの開発(もとい、通常のPCにおいても)を行って行く限り、
絶対に必要な知識だと思っていますので・・。


返信引用
固定ページ 3 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました