根据上篇Main()运行 flow, 依序进行 查看Code 具体实现。
一.SetupEnvirment()
file位置:src\util.cpp
函数:初始化运行环境
具体内容:
1.控制 内存分配:
解析说明:
sizeof(void*) == 4:判断系统为32bit(64bit 系统结果为8)
mallopt(M_ARENA_MAX, 1):由用户自定义arena 个数 .
设置为0:表示系统按CPU进行自动设置
相关概念:
mallopt :是控制内存分配的函数,原型为:
int mallopt(int param,int value)//控制内存分配的函数
glibc: c运行库,是Linux 系统中最底层api
glibc为了分配内存的性能的问题,使用了很多叫做arena的memory pool,缺省配置在64bit下面是每一个arena为64M,一个进程可以最多有 cores * 8个arena。假设你的机器是4核的,那么最多可以有4 * 8 = 32个arena,也就是使用32 * 64 = 2048M内存。 当然你也可以通过设置环境变量来改变arena的数量.例如export MALLOC_ARENA_MAX=1
hadoop推荐把这个值设置为4。当然了,既然是多核的机器,而arena的引进是为了解决多线程内存分配竞争的问题,那么设置为cpu核的数量估计也是一个不错的选择。设置这个值以后最好能对你的程序做一下压力测试,用以看看改变arena的数量是否会对程序的性能有影响。
arena: memory pool . Linux 内存管理参考,其中有arena 的介绍,包括数量限制、多arena的处理方式,可进入了解
如上式,过多的arena 分配会造成虚拟空间的浪费,所以初始化时 由用户自定义改为1.
2.默认系统区域设置
解析说明:
检测到非定义的某些操作系统,则初始化为默认的系统区域设置
std::locale(""); :根据当前运行环境正确设置locale(当前 locale 无效时 返回runtime error)
setenv("LC_ALL", "C", 1); 覆盖所有LC_*的设置值,采用默认。
C/C++程序中,locale(即系统区域设置,即国家或地区设置)将决定程序所使用的当前语言编码、日期格式、数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wchar_t如何输出、strftime()的格式等)。因此,对于每一个程序,都应该慎重处理locale设置。
C locale和C++ locale是独立的。C locale用setlocale(LC_CTYPE, “”)初始化,
C++ locale用std::locale::global(std::locale(“”))初始化。这样就可以根据当前运行环境正确设置locale。
备注说明(以下为百度百科摘录):
Locale是某一个地域内的人们的语言习惯和文化传统和生活习惯,是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。
Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。
在locale环境中,有一组变量,代表国际化环境中的不同设置:
1. LC_COLLATE 定义该环境的排序和比较规则
2. LC_CTYPE 用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。
3. LC_MONETARY 货币格式
4. LC_NUMERIC 非货币的数字显示格式
5. LC_TIME 时间和日期格式
6. LC_MESSAGES 提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"。
7. LANG LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。
8. LC_ALL
它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。
"C"是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。
相关概念:
POSIX :可移操作系统接口,定义了操作系统应该为应用程序提供的接口标准
setenv:查询和显示环境变量
3.本地语言输出设置
解析说明:
fs::path::imbue(loc); :
imbue函数是指对象引用,表示输出时,使用的区域语言对象: 本地区域语言
函数原型:locale basic_ios::imbue( const locale& loc);
参数说明:loc: const 对象引用,表示输出时,使用的区域语言对象
返回值:之前的使用的区域语言
相关概念:
参考:
百度百科
区块链研习社源码研读班 姝婧