是否可以将 page_size 存储到具有静态存储持续时间的对象中?
Posted
技术标签:
【中文标题】是否可以将 page_size 存储到具有静态存储持续时间的对象中?【英文标题】:Is it possible to store page_size into an object with static storage duration? 【发布时间】:2019-08-09 13:13:20 【问题描述】:我们可以在运行时通过sysconf(_SC_PAGESIZE)
提取page_size。我的第一个意图是将程序启动时的这个值放入具有静态存储持续时间的对象中。所以我的意图是在文件范围内声明一些extern
变量,如下所示
extern const size_t page_size;
但是当我尝试在文件范围内的其他地方将其定义为
const size_t page_size = (const size_t) sysconf(_SC_PAGESIZE);
它不编译。这似乎很清楚,因为6.7.9(p4)
:
一个对象的初始化器中的所有表达式 线程存储持续时间应为常量表达式或字符串 文字。
我不想在需要页面大小的任何时候致电sysconf(_SC_PAGESIZE)
。是否有一些解决方法或常见的解决方案是什么?
【问题讨论】:
这是sysconf()
函数的语法:long sysconf(int name);
注意返回值是long
,而不是const size_t
@user3629249 返回的值实际上让我感到困惑。他们有什么理由返回long
而不是size_t
。或者我们应该假设sysconf(_SC_PAGESIZE)
可以安全地转换为size_t
?
我不知道操作系统的作者在想什么,所以我不能告诉你为什么他们选择有符号值long
而不是像size_t
这样的无符号值但是,这可能是因为@ 987654337@ 可能会为其他配置参数返回一些负值
【参考方案1】:
sysconf(_SC_PAGESIZE)
是一个函数调用。它总是返回相同的值,但它仍然是一个函数调用,所以它不能用于初始化 C 中的全局变量。
如果您想避免重复调用该函数,可以将全局变量声明为非const
,并在应用程序启动时为其赋值。
【讨论】:
我有一个问题。如果我将extern const size_t page_size
放入某个头文件中,然后在文件范围为size_t page_size
的main
函数的翻译单元中简单地定义它,它看起来是否自然?以上是关于是否可以将 page_size 存储到具有静态存储持续时间的对象中?的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS 和 S3 存储桶对静态站点进行基本用户身份验证