|
|
1
12
我强烈建议你阅读 Understanding Strict Aliasing . 具体请参见标有“通过活接头铸造”的章节。它有很多很好的例子。虽然这篇文章是在一个关于Cell处理器的网站上发表的,并使用了PPC汇编示例,但几乎所有这些都同样适用于其他体系结构,包括x86。 |
|
|
2
2
由于您似乎对实现非常了解,可以确保int64_t和double的大小相同,并且具有合适的存储表示形式,因此可能会使用memcpy。然后你甚至不必考虑别名。 由于您使用的函数指针可能很容易内联,如果您愿意发布多个二进制文件,那么性能肯定不是一个大问题,但您可能想知道,一些编译器可以非常凶猛地优化memcpy-对于小整数大小,可以内联一组加载和存储,您甚至可能会发现变量被完全优化了,编译器的“复制”只是重新分配用于变量的堆栈槽,就像一个并集。
检查生成的代码,或者只是对其进行概要分析。即使在最坏的情况下,它也不会慢下来。 不过,总的来说,对byteswapping做任何过于巧妙的事情都会导致可移植性问题。存在具有中端双精度的ABI,其中每个单词都是小端,但大词排在第一位。 通常你可以考虑使用SaveTF和SCASNF存储双打,但是对于你的项目来说,文件格式不在你的控制之下。但是,如果您的应用程序只是将IEEE double从一种格式的输入文件转移到另一种格式的输出文件(不确定是否是,因为我不知道有问题的数据库格式,但如果是),那么您可能会忘记它是一个double的事实,因为您无论如何都不会将它用于算术。只需将其视为不透明字符[8],仅当文件格式不同时才需要字节切换。 |
|
|
3
2
该标准规定,向工会的一个领域写入数据并立即从中读取数据是未定义的行为。因此,如果你按规则行事,基于联合的方法就行不通了。 宏通常是个坏主意,但这可能是一个例外。在C中,应该可以使用一组使用输入和输出类型作为参数的宏来获得类似模板的行为。 |
|
|
4
0
简言之,改变这一点:
为此:
|
|
5
-1
编辑:
关于double/float,只需通过内存强制转换将它们存储到ints即可:
提问者提供了以下链接: http://cocoawithlove.com/2008/04/using-pointers-to-recast-in-c-is-bad.html 为了证明铸造是不好的。。。不幸的是,我只能强烈反对这一页的大部分内容。引述和评论:
这一点都不危险,也不是一种坏习惯。如果你做得不正确,它才有可能导致错误,就像用C语言编程如果你做得不正确,它有可能导致错误一样,任何语言的编程也是如此。根据这个论点,你必须完全停止编程。
这是事实,但不幸的是 与我的代码完全无关
现在,doublePointer和intPointer都指向相同的内存位置,但将其视为相同的类型。这是你应该通过工会来解决的情况。事实上,其他任何事情都是非常糟糕的。糟糕,这不是我的代码所做的! 我的代码由 价值 ,而不是 参考 . 我将一个双精度指针转换为int64(或者反过来),然后 立即服从 信息技术一旦函数返回,就没有指向任何对象的指针。有一个int64和一个double,它们与函数的输入参数完全无关。我从不将任何指针复制到不同类型的指针(如果您在我的代码示例中看到了这一点,您会严重误读我编写的C代码),我只是将值转移到不同类型的变量(在自己的内存位置)。因此,类型双关的定义根本不适用,因为它说“引用内存中的相同位置”,这里没有任何内容引用相同的内存位置。
我的代码只不过是一个内存拷贝,只是用C编写的,没有外部函数。
可以写成
|
|
|
Nils · 二进制文件中快速反转float32端的方法 8 年前 |
|
|
rubyquartz · 交换无符号短整数的字节 8 年前 |
|
|
Lefteris · 将二进制数据读取到long int 8 年前 |
|
|
smokums · 小端点编码Go lang 8 年前 |
|
|
user3003999 · 字节顺序错误代码是如何工作的? 8 年前 |
|
|
memeKing · Python-数据包处理和修改 8 年前 |
|
|
Juan González · 火星MIPS模拟器是大端还是小端 8 年前 |