gpt4 book ai didi

c++ - 以下代码和编译时间要求会出什么问题?

转载 作者:行者123 更新时间:2023-11-28 01:02:17 24 4
gpt4 key购买 nike

首先让我说我知道下面的代码将被认为是“坏”的做法..但我受环境的“一点”限制:

在动态库中,我希望使用“指针”(指向类)——但是将使用此 dll 的程序只能传递和接收 double 值。所以我需要将指针“适配”成 double 。下面的代码试图实现这一点,我希望它能在 64 位环境中工作:

EXPORT double InitializeClass() {
SampleClass* pNewObj = new SampleClass;
double ret;
unsigned long long tlong(reinterpret_cast<unsigned long long>(pNewObj));
memcpy(&ret, &tlong, sizeof(tlong));
return ret;
}
EXPORT double DeleteClass(double i) {
unsigned long long tlong;
memcpy(&tlong, &i, sizeof(i));
SampleClass* ind = reinterpret_cast<SampleClass* >(tlong);
delete ind;
return 0;
}

现在我再次意识到使用 vector 并将指针存储在 vector 中可能会更好。但是我真的希望使用指针(作为替代)来做到这一点。那么谁能告诉我可能的失败/更好的版本?

明显的失败是如果 double 和 unsigned long long 的大小长度不同(或者指针长于 64 位)。有没有办法在编译时检查这个? - 并在大小不相同的情况下给出编译错误?

最佳答案

在理论上,至少,一个 64 位指针,类型双关语到 64 位 IEEEdouble,可能导致捕获 NaN,而 NaN 又会捕获。在实践中,这可能不是问题;我试图捕获 NaN实际上做一些除了被忽视之外的事情并不是很成功。

另一个可能的问题是值可能没有标准化(事实上​​,可能不会)。硬件有什么用非标准化值取决于:它可以将它们传递给透明地,默默地标准化它们(改变“指针”),或触发某种运行时错误。

还有别名的问题。通过一个访问指针类型为 double 的左值是未定义的行为,许多编译器在优化时会利用这一点,假设通过 double*double& 引用的更改不会影响任何指针(并在写入之前移动指针的负载double,或者修改后不重新加载指针双)。

实际上,如果您在 Intel 环境中工作,我认为所有“64 位”指针的高 16 位实际上为 0。这就是指数存在于 IEEE double 中,0 的指数是渐进的下溢,不会陷入(至少在默认模式下),也不会被改变。所以你的代码可能看起来确实有效,只要编译器不会优化太多。

关于c++ - 以下代码和编译时间要求会出什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8120359/

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