melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  8241  : トラックバック  41

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

_alloca() って知ってますか?

_alloca() は、メモリをスタックから動的に割り当てる関数です。関数を抜けると自動的に解放されます。

当然ながら、大量に割り当てようとするとスタックオーバーフローを起こします。

C# の stackalloc と似たような感じですが、こちらはスタックオーバーフローを含めたバッファオーバーランの検出を自動的に行ってくれるので結構安心して使えます。

_alloca() はスタックオーバーフローを起こしてしまう可能性があるため、_alloca() の解説にある通り _malloca()?を使うべきなのですが、こいつはヒープから割り当てられる可能性があるので、_freea() を明示的に呼び出してやる必要があり、非常にめんどいです。

?

もっと安心して _alloca() みたいな機能が使えないかな、ということで ATL の出番です。

atlalloc.h には _ATL_SAFE_ALLOCA() というマクロがあり、これを使うと _malloca() みたいな動作(小さい値ならスタックから、大きい値ならヒープから確保)をしますが、解放を明示的に行う必要はありません。

ただし、_ATL_SAFE_ALLOCA() を使用する前に USES_ATL_SAFE_ALLOCA という文を記述しておく必要があります。

void foo()
{
    // これを宣言しておく必要がある。
    USES_ATL_SAFE_ALLOCA;

    // 1MB のメモリをスタックから確保する?
    void* p = _ATL_SAFE_ALLOCA(1 * 1024 * 1024, _ATL_SAFE_ALLOCA_DEF_THRESHOLD);
    // _ATL_SAFE_ALLOCA_DEF_THRESHOLD より大きい値なので、実際はヒープから確保される

    // p を使ってほげほげする
    ...

    // 解放はしなくて良い
    return;
}

_ATL_SAFE_ALLOCA の第2引数はスタックから確保するかヒープから確保するかの境界線で、この値以下の要求であればスタックから確保され、そうでない場合はヒープから確保されます。あとそれから、この値以下であっても、それを確保したらスタックオーバーフローを起こしてしまう場合にもヒープから確保します。

_ATL_SAFE_ALLOCA_DEF_THRESHOLD というのは ATL が設定したデフォルト値です。現在は 1024 と定義されているようです。

?

これを使えば、スタックオーバーフローの危険性が少なく、しかも利便性を損なわず _alloca() みたいな機能が使えるので、_alloca() や _malloca() を使うぐらいであれば、是非こちらを使ってみましょう。

投稿日時 : 2007年8月3日 3:25

コメント

# re: _ATL_SAFE_ALLOCA 2007/08/03 8:28 774RR
何も考えずに std::vector を使うに1票

# re: _ATL_SAFE_ALLOCA 2007/08/03 9:55 melt
そこで ATL::CAtlArray<> の出番ですよ、とw

まあ普段は使わないと思いますけど、速度が求められている場面で、テンポラリ的な領域が欲しいけど事前に分からない場合、動的にメモリを確保しないといけないわけですけど、時間とリソースを節約するために出来る限りスタックから確保したほうが良い……ということもあるかもしれませんw

# re: _ATL_SAFE_ALLOCA 2007/08/03 11:13 とっちゃん
ATL なら CTempBuffer もお勧め。
と思ってヘルプ引いたらドキュメントねーでやがんの...orz

obusolute しちゃったのか?それとも単にundocなだけなのか?
すげー微妙...

#CTempBuffer はスタックオーバーフローを起こしますがw

# re: _ATL_SAFE_ALLOCA 2007/08/03 12:00 melt
CTempBuffer、固定値のスタックを取って一定の値以上になるとヒープから確保するようになるんですね。結構便利そうですw

自分は ATL のドキュメント、ほとんど見たこと無いですw
atlxxx.h の中身を、こんなのあるんだ~って感じでいろいろ見て回ってますw

# re: _ATL_SAFE_ALLOCA 2007/08/03 12:11 とっちゃん
>固定値のスタックを取って
です。

便利なのは、operator T*() を持ってること。
alloca とちがい、型を保持してくれるので、超便利ですw


# re: _ATL_SAFE_ALLOCA 2007/08/03 14:37 melt
なるほど、確かに operator T*() が使えると便利ですね。
_alloca() だと関数抜けたときに解放されちゃうから、クラスの内部で生成することが出来ないんですよねぇ……。

# [C++]USES_CONVERSION_EX 2008/05/22 10:53 melt日記
[C++]USES_CONVERSION_EX

# [C++]USES_CONVERSION_EX 2008/05/22 10:54 melt日記
[C++]USES_CONVERSION_EX

# Articles about _malloca volume 3 &laquo; Article Directory 2010/06/15 4:29 Pingback/TrackBack
Articles about _malloca volume 3 &laquo; Article Directory

# jianbin0301 2018/03/01 14:27 165464@qq.com
http://www.uggoutletstoresofficial.us.com
http://www.raybanssunglassessale.us.com
http://www.canadagoosejacketsusa.us.com
http://www.pandora-charmssaleclearance.org.uk
http://www.michaelkors.eu.com
http://www.raybansunglassesoutlets.com.co
http://www.swarovski-outlets.us.com
http://www.kobe9elites.us.com
http://www.nbajerseysstore.us.com
http://www.michaelkors.de.com
http://www.ferragamoshoes.org.uk
http://www.lacostepoloshirts.us.com
http://www.airforce1.us.com
http://www.canadagoose-jackets.org.uk
http://www.canadagoosejackets.me.uk
http://www.michaelkorsoutletclearance-online.us.com
http://www.fitflopssale.in.net
http://www.canadagoosejacketscg.ca
http://www.jordanshoesshop.us.com
http://www.pandoracharmss.us.com
http://www.pandoraoutlet-store.us.com
http://www.cheapjerseyswholesale.org
http://www.newbalanceshoes.in.net
http://www.coachfactoryoutlet-clearance.us.com
http://www.swarovskicrystalco.org.uk
http://www.montblancpenssale.us.com
http://www.fredperrypolo-shirts.com
http://www.rayban--sunglasses.co.uk
http://www.toryburchoutletofficials.us.com
http://www.christianlouboutins.org.uk
http://www.mulberrybagsuk.co.uk
http://www.raybansunglassesonsales.us.com
http://www.poloralphlaurenoutlet-online.us.com
http://www.uggoutlet.ca
http://www.reebokoutletstores.us.com
http://www.airhuaracheuk.org.uk
http://www.outlettruereligion.in.net
http://www.coachfactoryoutletstore.com.co
http://www.mulberryhandbagss.org.uk
http://www.ralphlauren-polo.us.org
http://www.raybansunglasses2.us.com
http://www.nfljerseysfactorystore.us.com
http://www.raybansunglassesonlines.us.com
http://www.cheapsoccerjersey.net
http://www.longchamphandbagssale.co.uk
http://www.canadagooseoutletclearance.us.com
http://www.michaelkorsoutletfriday.us.com
http://www.oakleysunglasseswear.us.com
http://www.nikeoutlets.us.org
http://www.poloralphlaurendiscount.us.com
http://www.canadagooseoutletcom.us.com
http://www.coachoutletclearance.us.org
http://www.canadagooseoutletcoats.us.com
http://www.jordanshoesstore.us.com
http://www.christianlouboutin-shoes.me.uk
http://www.ralph-laurenpoloshirts.us.com
http://www.uggsoutletshop.us.com
http://www.coachoutletclearanceonline.us.com
http://www.michaelkorsoutletme.us.com
http://www.raybanssunglassesoutlets.us.com
http://www.oakleysunglassesformens.us.com
http://www.coach-factoryoutlets.us.org
http://www.suprashoes.us.com
http://www.oakleysunglasseswholesaleus.us.com
http://www.fitflopsshoes.in.net
http://www.katespadeoutletsales.us.com
http://www.mcmoutletstore.us.org
http://www.michaelkorsoutletcoupons.us.com
http://www.oakleysunglassessites.us.com
http://www.jordanshoesfactory.us.com
http://www.nikerosheone.us
http://www.coachoutletcoupons.us.com
http://www.canadagooseoutletsalestore.us.com
http://www.uggsoutletco.us.com
http://www.yeezyboost350sale.us.com
http://www.clevelandcavaliers.us.com
http://www.poloralphlaurenofficial.us.com
http://www.raybansunglassesforwomens.us.com
http://www.coachoutletstore.com.co
http://www.adidasnmdad.us.com
http://www.katespadeoutletofficial.us.org


# michael kors factory outlet 2018/05/21 12:55 jinyizhixia
http://www.dsquared.us.com
http://www.ralphlaurenpolo.org.uk
http://www.polopas-cher.fr


# re: Ruby で数値を 0 埋めする 2019/01/24 13:44 zzyytt
http://www.goyard.us.com
http://www.stephencurry.us.com


Post Feedback

タイトル
名前
Url:
コメント