問題タブ [alloca]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Cで構造定義を隠すのは良い習慣ですか?
私の意見では、C で構造体の定義を非表示にすると、構造体のメンバーに直接アクセスできないように (コンパイラーの助けを借りて) 強制するため、一般的にコードが安全になります。
ただし、この方法では構造体のサイズが利用できなくなるため、構造体のユーザーがその型の変数をスタックに置くことを宣言できないという欠点があります (したがって、ユーザーは、malloc()
望ましくない場合でもヒープを経由します)。
これは、POSIX に準拠しalloca(3)
ていなくても、すべての主要な libc 実装に存在する関数によって (部分的に) 解決できます。
これらの長所と短所を念頭に置いて、そのような設計は一般的に良いと見なすことができますか?
でlib.h
:
でlib.c
:
でexample.c
:
c - 各関数インスタンスでサイズが異なるVLAを返す方法は?
構造内で VLA を宣言できるようにする、優れた GCC 拡張機能を使用しています。今のところ、この方法で VLA を関数に (値で) 渡す方法を見つけました。また、非常に限られたコンテキストで返す方法を見つけました。
この例の関数コードは次のとおりです。
上記の例は、テスト目的で設計されています (特に、コンパイルされたバイナリ コードを比較するため)。
ただし、返される配列のサイズは関数の異なる呼び出し間で変化しないため、これはかなり制限されています。
返された配列のサイズを、関数パラメーターの 1 つまたはこの関数の他のローカルと等しくするにはどうすればよいでしょうか。
alloca
割り当てられたメモリは関数終了 (IRC) ですぐに破棄されるため、この場合は役に立たないと思います。
私はこのようなものを書きたい:
言い換えれば、疑問符内の型は何でしょうか? または、他の解決策があるかもしれません(ただし、を使用せずにmalloc
)?
このような関数の理論的な使用法では、返された構造体のサイズを呼び出し元が利用できないため、返された値を格納するために理論的には別の型が必要になります (これを回避する方法がない限り?)。しかし、一見すると、次のようになります。
このようなことをすると:
func5
VM の戻り値の型は、その引数またはローカル変数に依存するため、機能しません。ただし、この関数はまだ定義できないため、現時点ではすべて理論上のものです。
c++ - alloca使用時のアクセス違反
私のstackAlloc
関数は次のようになります。
そのように変更すると、すべてが機能する代わりにstackAlloc
関数が常に使用されます。malloc
alloca
関数をマクロに変更したところ、期待どおりに機能するようになりました。
c - C で alloca() をエミュレートする
GNU libs docs を読むと、次のことがわかります。
一部の非 GNU システムは alloca をサポートしていないため、移植性が低くなります。ただし、C で記述された alloca のより低速なエミュレーションは、この欠陥のあるシステムで使用できます。
alloca()
VLAも利用できないと仮定すると、Cエミュレーションはどのようになりますか?
c++ - alloca() と VLA および C++
私がインターネットで見つけた C++の唯一のalloca()
代替品は、次のようなものです。
しかし、明らかに、これはalloca()
私たちが知っていて愛しているものではなく、関数でもマクロでもありません。関数呼び出しalloca()
のセマンティクスにより近い実装を記述できますか? alloca()
おそらくマクロとして?マクロであろうと関数であろうと、ヒープではなくスタックからスペースを割り当てる必要があります。
c++ - シンボル検索エラー: 未定義のシンボル: _alloca
関数 _alloca() (malloc.h で定義) を内部的に使用する共有オブジェクト (.so) を構築しています。この .so はスムーズにコンパイルされます。しかし、_alloca() を使用する関数を呼び出すとすぐに、コンソール出力でアプリケーションがクラッシュします。
だから:この外部参照を解決するためにビルド中にリンクしなければならないライブラリに対するアイデアはありますか?
プラットフォームは CentOS7 x64
ありがとう!
c++ - 固定サイズの配列 vs alloca (または VLA)
alloca()
固定サイズの配列を宣言してスタックに割り当てられたメモリよりも適しているのはいつですか?
詳細:
私たちが知っているようにalloca()
、物議を醸す関数です。むやみに使用すると、スタック オーバーフローが発生する可能性があります。慎重に使用すると、ヒープの割り当てを回避することで、タイトなループから数ナノ秒短縮できます。なぜが悪いと見なされるのかについてのこの質問では、上位の回答のいくつかが を時折使用することを推奨しています。alloca
alloca
スタックから割り当てるもう 1 つの方法は、単純に固定サイズの配列を宣言することです。この戦略の例は、 Howard Hinnant の stack allocator のarena
クラスにあります。(そのコードはもちろん C++ ですが、概念は C にも当てはまります。)
alloca
固定サイズの配列とのトレードオフは何ですか? 一方が他方よりも明らかに好ましいのはいつですか?個々の状況 (パフォーマンスが主要な目標であり、ホットスポットが既に特定されている場合) で経験的にテストする必要があるのは、単にパフォーマンスの問題ですか? 固定サイズの配列はより悲観的です。スタックに割り当てたい分だけ常に割り当てますが、これが良いか悪いかは明らかではありません。
できるだけ明確にするためにalloca
、固定サイズの配列を使用する理由と思われる 2 つの関数実装の非常に単純な例を次に示します。
非常によく似た別のオプションalloca
は VLA です。私の知る限り、alloca
と VLA から取得したメモリは本質的に同じ動作をするため、この質問は VLA にも当てはまります。その理解が間違っている場合は、それについて言及してください。