【发布时间】:2018-04-26 04:36:02
【问题描述】:
请看下面的代码sn-p
#define HF_ND_SZ sizeof(struct huffman_node)
#define TSIZE_MAX 256
struct huffman_node * build_decomp_huffman_tree(uint64_t *table, int size) {
static struct huffman_node huffman_node_list2[TSIZE_MAX * 3];
int i = 0, j = 0;
int k = TSIZE_MAX * 2; // this is the case point 1
//...//
for (i = 0; i < size - 1; i++) {
huffman_node_list2[k + i] = huffman_node_list2[i + 1]; // point 2
huffman_node_list2[TSIZE_MAX + i].right = &huffman_node_list2[k+ i];
// ... //
}
return &huffman_node_list2[size - 1];
}
为简单起见,我将代码减少并指出了我要突出显示的位置,也不要把算法和结构想得太深。
我想要的是,如果我们将 point 1 定义为 const int k = TSIZE_MAX * 2;,那么在 point 2 或 3 是否会发生任何优化,其中分配发生在连续数据上(数组)huffman_node_list2[k + i] = huffman_node_list2[i + 1]; ?
(如果我的假设是错误的,请容忍并纠正我的假设,我认为当我们在本地或全局范围内声明const 时,如果我们使用该不可变内存,它被创建为不可变内存分配> 并在循环结构中执行 数学运算,如 第 2 点或第 3 点([k + i]),在运行时程序必须加载不可变内存循环的每次迭代并将结果存储在临时内存位置,如果不可变内存有大块怎么办,希望你能抓住我的想法,我是正确的吗?)
【问题讨论】:
-
是有实际问题,还是只是为了学习而问?
const对于实体意味着编译器将不允许修改它的代码,但它可以很好地存储在可修改的内存中。即使它存储在不可修改的内存中(从进程的角度来看 - 区别仅在于内核将该内存页面设为只读),它也不需要先复制到其他地方,所以我看到const没有理由让事情变慢。可修改的内存也被加载到寄存器中以便快速处理。 -
const的目的不是让代码更快,而是让代码更正确。当您标记const时,您是在要求编译器(通过错误)告诉您是否/何时尝试修改它。 -
const根本不需要创建内存位置,除非您获取它的地址。更有可能huffman_node_list2[k + i] = huffman_node_list2[i + 1]被编译为huffman_node_list2[TSIZE_MAX * 2 + i] = huffman_node_list2[i + 1],其中不仅TSIZE_MAX * 2在编译时被评估,而且huffman_node_list2+TSIZE_MAX*2也是如此,如果你明白我的意思的话。 -
@SirGuy 修改声明为
const的变量是UB,所以不,它总是正确的,标记为const的变量不能被修改。const_cast仅在诸如 const 参考之类的东西上是合法的 -
另外,你必须决定你问的是C还是C++作为@987654338的真正含义@ 两者之间有很大不同!
标签: c optimization constants compiler-optimization