3

私のコードにはいくつかの呼び出しがgetenvあります(何度も呼び出されます)ので、最適化の可能性が見えます。私の質問は、getenvどういうわけか結果を内部的にキャッシュするのですか、それとも呼び出しごとに環境変数を照会するのですか?

コードのプロファイルを作成しましたgetenvが、ボトルネックではありませんが、より効率的であれば変更したいと思います。

副次的な質問として、実行中にプログラムの環境変数を変更できますか? 私はそうしていないので、私の場合、結果をキャッシュすることは安全です。それはただの好奇心です。

4

3 に答える 3

4

環境変数は通常、特定のプロセスのメモリに存在するため、そこにキャッシュするものはなく、すぐに利用できます。

更新に関しては、実行中のプロセスの任意のコンポーネントがputenv更新された環境を呼び出すことができます。それが起こることが予想される場合は、長期間キャッシュしないでください。

于 2012-05-17T13:38:42.760 に答える
1

結果がキャッシュされるとは思えません。環境変数は呼び出しごとに変更される可能性があります。そのキャッシュを自分で実装できます。

#include <map>
#include <iostream>
#include <string>
#include <stdexcept>
#include <cstdlib>


class EnvCache {
public:
    const std::string &get_env(const std::string &key) {
        auto it = cache_entries.find(key);
        if(it == cache_entries.end()) {
            const char *ptr = getenv(key.c_str());
            if(!ptr)
                throw std::runtime_error("Env var not found");
            it = cache_entries.insert({key, ptr}).first;
        }
        return it->second;
    }

    void clear() {
        cache_entries.clear();
    }
private:
    std::map<std::string, std::string> cache_entries;
};

int main() {
    EnvCache cache;
    std::cout << cache.get_env("PATH") << std::endl;
}

環境変数を変更すると、キャッシュ エントリが無効になる可能性があります。に直接マップすることもできますがconst char*、それはあなた次第です。

于 2012-05-17T13:44:21.567 に答える
0

プロセスは、新しいプロセスを作成するプロセスから環境を継承します。これはメモリに保持されます。

実際、CおよびC ++ではmain、環境を含む追加のパラメーターを持つように定義できます。http://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html#Program-Argumentsを参照してください。

さらに、を使用extern char **environ;して、環境を含むアレイにアクセスできます。(これはnullで終了します)

したがって、キャッシュは必要ありません。環境変数は、配列としてメモリに保持されます。

于 2012-05-17T13:49:02.063 に答える