getenv 是否缓存结果
Does getenv cache the result?
我在代码中多次调用getenv
(调用了很多次(,所以我看到了优化的潜力。我的问题是,getenv
以某种方式在内部缓存结果,还是在每次调用时查询环境变量?
我已经分析了代码,getenv
不是瓶颈,但如果更有效,我仍然想更改它。
作为一个附带问题,可以在程序运行时更改环境变量吗?我没有这样做,所以在我的情况下缓存结果是安全的,这只是好奇心。
环境变量通常存在于给定进程的内存中,因此没有什么可以缓存的,它们随时可用。
至于更新,正在运行的进程的任何组件都可以调用putenv
来更新环境,如果您预计会发生这种情况,则不应长时间缓存它。
我怀疑它会缓存结果,环境变量可能会因调用而异。您可以自己实现该缓存:
#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*
,但这取决于您。
进程从创建新进程的进程继承环境。这是保存在内存中。
实际上,在 C 和 C++ 中,您可以定义main
具有包含环境的额外参数 - 请参阅 http://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html#Program-Arguments
此外,还可以使用 extern char **environ;
访问包含环境的阵列。(这是空终止(
因此,您不需要缓存。环境变量作为数组保存在内存中。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何指定创建文件函数获取未缓存的结果?
- Linux PURF工具显示怪异的缓存结果
- TLS变量访问的结果未缓存
- 静态常规缓存结果
- 从多个线程收集结果的缓存友好方式
- 缓存错过压力测试:令人惊叹的结果.任何解释
- getenv 是否缓存结果
- 缓存函数的结果可能包括void
- C++成员函数结果缓存实现
- 原子增量正在刷新其他缓存行(提供的代码和结果)
- 频繁执行的表达式是否会缓存其结果