加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 重复文字和硬编码

发布时间:2020-12-16 06:48:07 所属栏目:百科 来源:网络整理
导读:我发现以下模式经常发生: b-last = ngx_cpymem(b-last,"/prehr",sizeof("/prehr") - 1); 请注意,文字字符串使用了两次.提取物来自nginx源库. 在编译单元中遇到这些文字时,编译器应该能够合并这些文字. 我的问题是: 在编译单元中遇到商用级编译器(VC,GCC,LL
我发现以下模式经常发生:

b->last = ngx_cpymem(b->last,"</pre><hr>",sizeof("</pre><hr>") - 1);

请注意,文字字符串使用了两次.提取物来自nginx源库.

在编译单元中遇到这些文字时,编译器应该能够合并这些文字.

我的问题是:

>在编译单元中遇到商用级编译器(VC,GCC,LLVM / Clang)时是否删除了这种冗余?
>链接目标文件时,(静态)链接器是否会删除此类冗余.
>如果2适用,这种优化会在动态链接期间发生吗?
>如果1和2适用,它们是否适用于所有文字.

这些问题很重要,因为它允许程序员在不损失效率的情况下进行冗长 – 即,考虑将大量静态数据模型硬连接到程序中(例如,在某些低级方案中使用的决策支持系统的规则) .

编辑

2分/澄清

>上面的代码由公认的“主”程序员编写.这家伙一手写了nginx.
>我没有问过文字硬编码的哪种可能机制更好.所以不要偏离主题.

编辑2

我最初的例子是非常人为的和限制性的.以下代码段显示了嵌入到内部硬编码知识中的字符串文字的用法.第一个片段用于配置解析器告诉它为哪个字符串设置哪个枚举值,第二个片段通常用作程序中的字符串.我个人对此感到满意,只要编译器使用字符串文字的一个副本,并且由于元素是静态的,它们不会进入全局符号表.

static ngx_conf_bitmask_t  ngx_http_gzip_proxied_mask[] = {
   { ngx_string("off"),NGX_HTTP_GZIP_PROXIED_OFF },{ ngx_string("expired"),NGX_HTTP_GZIP_PROXIED_EXPIRED },{ ngx_string("no-cache"),NGX_HTTP_GZIP_PROXIED_NO_CACHE },{ ngx_string("no-store"),NGX_HTTP_GZIP_PROXIED_NO_STORE },{ ngx_string("private"),NGX_HTTP_GZIP_PROXIED_PRIVATE },{ ngx_string("no_last_modified"),NGX_HTTP_GZIP_PROXIED_NO_LM },{ ngx_string("no_etag"),NGX_HTTP_GZIP_PROXIED_NO_ETAG },{ ngx_string("auth"),NGX_HTTP_GZIP_PROXIED_AUTH },{ ngx_string("any"),NGX_HTTP_GZIP_PROXIED_ANY },{ ngx_null_string,0 }
};

紧随其后:

static ngx_str_t  ngx_http_gzip_no_cache = ngx_string("no-cache");
static ngx_str_t  ngx_http_gzip_no_store = ngx_string("no-store");
static ngx_str_t  ngx_http_gzip_private = ngx_string("private");

对于那些留在话题上的人,勇敢!

解决方法

请注意,对于sizeof(“< / pre>< hr>”)的特定情况,几乎可以肯定字符串文字永远不会出现在输出文件中 – 整个sizeof表达式可以计算为整数常量11在编译时.

尽管如此,编译器合并相同的字符串文字仍然是一种非常常见的优化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读