getenv缓存结果吗?

时间:2012-05-17 13:33:27

标签: c++ optimization environment-variables

我的代码中有几次调用getenv(很多次调用),所以我看到了优化的可能性。我的问题是,getenv以某种方式在内部缓存结果,还是在每次调用时查询环境变量?

我已经对代码进行了分析,getenv不是瓶颈,但如果效率更高,我还是想改变它。

作为一个附带问题,可以在程序运行时更改环境变量吗?我不这样做,所以在我的情况下缓存结果会很安全,这只是好奇心。

3 个答案:

答案 0 :(得分:2)

环境变量通常存在于给定进程的内存中,因此没有任何内容可以缓存,它们随时可用。

对于更新,正在运行的进程的任何组件都可以调用putenv来更新环境,如果您希望这种情况发生,则不应该长时间缓存它。

答案 1 :(得分:1)

流程从创建新流程的流程继承环境。这是在记忆中。

的确,在C和C ++中,您可以定义main以包含一个包含环境的额外参数 - 请参阅http://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html#Program-Arguments

此外,您可以使用extern char **environ;访问包含环境的阵列。 (这是空终止的)

因此您不需要缓存。环境变量作为数组保存在内存中。

答案 2 :(得分:0)

我怀疑它会缓存结果,环境变量可能会因呼叫而异。您可以自己实现该缓存:

#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*,但这取决于您。

相关问题