c – 重复文字和硬编码
我发现以下模式经常发生:
b->last = ngx_cpymem(b->last,"</pre><hr>",sizeof("</pre><hr>") - 1); 请注意,文字字符串使用了两次.提取物来自nginx源库. 在编译单元中遇到这些文字时,编译器应该能够合并这些文字. 我的问题是: >在编译单元中遇到商用级编译器(VC,GCC,LLVM / Clang)时是否删除了这种冗余? 这些问题很重要,因为它允许程序员在不损失效率的情况下进行冗长 – 即,考虑将大量静态数据模型硬连接到程序中(例如,在某些低级方案中使用的决策支持系统的规则) . 编辑 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在编译时.
尽管如此,编译器合并相同的字符串文字仍然是一种非常常见的优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |