首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getenv缓存结果了吗?

getenv缓存结果了吗?
EN

Stack Overflow用户
提问于 2012-05-17 21:33:27
回答 3查看 2.1K关注 0票数 3

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

我已经分析了代码,getenv不是一个瓶颈,但如果它更有效的话,我仍然想改变它。

作为一个次要问题,是否可以在程序运行时更改其环境变量?我没有这么做,所以在我的例子中,缓存结果是安全的,这只是好奇。

EN

回答 3

Stack Overflow用户

发布于 2012-05-17 21:38:43

环境变量通常驻留在给定进程的内存中,因此没有什么可缓存的,它们随时都可以使用。

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

票数 4
EN

Stack Overflow用户

发布于 2012-05-17 21:44:22

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

代码语言:javascript
复制
#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*,但这取决于您。

票数 1
EN

Stack Overflow用户

发布于 2012-05-17 21:49:02

进程从创建新进程的进程继承环境。它保存在内存中。

实际上,在C和C++中,您可以定义main,使其具有包含环境的额外参数-请参见http://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html#Program-Arguments

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

因此,您不需要缓存。环境变量以数组的形式保存在内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10636768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档