2017-01-06 12 views

答えて

4

[...]ビルドタイプ[...]に基づく属性のみを含めることはできますか?

はい。

#[cfg_attr(not(debug_assertions), inline(always))] 
#[cfg_attr(debug_assertions, inline(never))] 
fn foo() { 
    println!("moo") 
} 

これはおそらくあなたがあなたの目標になります最も近い:それはcfg_attrが何のためにあるのかです。インライン注釈( "always"と "never"があっても)は、コンパイラによって無視されることに注意してください。あなたには以下のような理由があります。


しかし:何を達成したいですか?

コンパイラはかなりスマートですが、人間は決定をインライン展開するのはかなり悪いです。 #[inline]がなくても、コンパイラはリリースモードで機能をインライン化します。デバッグモードではインライン展開されません。

自分でインライン展開を行うために非常に良い特別な理由がない場合は、手で触れないでください!コンパイラは、ほぼすべての場合に正しいことを行うだろう:)

をしてもthe reference言う:

コンパイラが自動的に内部の経験則に基づいた機能をインライン化。誤ってインライン関数をインライン化すると、実際にはプログラムが遅くなる可能性があるため、注意して使用する必要があります。

+0

私はプロジェクトのコードを調べ始めました。クラッシュはインライン関数で発生しました。この関数はデバッグビルド中でもインライン化されています(私が間違ってビルドしていない限り)。私は問題を解決するために行を削除することができますが、条件付きで適用できるかどうかを知ることは便利かもしれないと考えました。 – NeuralSandwich

+0

ええと、 '#[cfg_attr(not_debug_assertions)、インライン)]を使用すると、lldbにはまだ複数の場所があります。 ' – NeuralSandwich

+0

@NeuralSandwichコードを変更して少し説明を追加しました。基本的には決して確かではありません。リファレンスには、「#[inline(never)] ** **はコンパイラにインライン展開を行わないように**求めています。 –

関連する問題