gpt4 book ai didi

c++ - 变量优化为零

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:05 25 4
gpt4 key购买 nike

在下面的程序中,如果 out 变量在 O1 之上进行优化编译,它总是打印为 0。如果我取消注释 digitTruncate 函数中的 cout 行,则 out 变量可以正确打印任何级别的优化。

我是在做一些“未定义”的事情,还是编译器问题?

#include <iostream>
#include "mytime.hpp"
#include <stdint.h>

template <class IN>
int32_t
digitTruncate (IN data_in, uint32_t digits, uint64_t* data_out,
int32_t bits = -1, bool safe = false)
{
if (bits == -1)
bits = (digits / 0.3010299957) + 1;
if (!safe)
{
if (bits > (int32_t)sizeof(data_in) * 8)
return -1;
}
*data_out = (data_in & (0xffffffffffffffff >> (64 - bits)));
//std::cout << *data_out << std::endl;
return (bits / 8) + 1;
}

int
main()
{
uint64_t cycles1, cycles2;
uint32_t out;
char* block = new char[8];
cycles1 = mytime::cycles();
for (int i = 0; i < 10000; i++)
{
uint32_t init = (uint32_t)mytime::cycles();
digitTruncate(init, 5, ((uint64_t*)block), 17, true);
out = *((uint32_t*)block);
}
cycles2 = mytime::cycles();
std::cout << cycles2 - cycles1 << std::endl;
std::cout << "results: " << out << std::endl;

return 0;
}

最佳答案

通过访问 block 作为指向 uint64_tuint32_t 的指针,您违反了严格的别名规则。允许编译器假定特定地址仅作为 char* 和另一种类型访问(别名)。您正在使用两种非 char* 类型,因此关于编译器的优化器将做什么的所有赌注都没有了。

关于c++ - 变量优化为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16291493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com