看看这段代码
int main()
{
int i = 1U << 31; // assume this yields INT_MIN
volatile int x;
x = -1;
x = i / x; //dividing INT_MIN by -1 is UB
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它在典型平台上调用未定义的行为,但"行为"与我的预期完全不同 - 它就好像它是一个无限循环.我能想到它咬人的场景.
当然未定义是未定义的,但我检查了输出程序集,它使用了一个简单的idiv- 为什么它不陷阱?为了便于比较,除以零会导致立即中止.
使用Windows 7 64位和MingW64
任何人都可以向我解释这个吗?
编辑
我尝试了几个选项,结果总是一样的.
这是集会:
.file "a.c"
.def __main; .scl 2; .type 32; .endef
.section .text.startup,"x"
.p2align 4,,15
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
subq $56, %rsp
.seh_stackalloc 56
.seh_endprologue …Run Code Online (Sandbox Code Playgroud) Java 8增加了三个围栏sun.misc.Unsafe.
看完他们的文档后我感到很困惑.
所以,我在网上搜索,发现了这个链接.
根据上面的页面,我相信这些方法在实践中几乎没有增加任何内容.如果我错了,请纠正我,粗略地说,loadFence(),storeFence()和fullFence()分别对应于volatile read,lazy write和volatile write,尽管技术上这些fences比volatile变量更强.所以loadFence()是一个获取栅栏,而storeFence()是一个释放栅栏,而fullFence()是一个完整的栅栏.
但是,storeFence()的文档看起来很奇怪.
它说,
/**
* Ensures lack of reordering of stores before the fence
* with loads or stores after the fence.
*/
void storeFence();
Run Code Online (Sandbox Code Playgroud)
这看起来不像是一个释放围栏.它应该如何使用?不应该
/**
* Ensures lack of reordering of loads or stores before the fence
* with stores after the fence.
*/
void storeFence();
Run Code Online (Sandbox Code Playgroud)
我之前和以后意味着先前的意思.
编辑
当我说这些"围栏在实践中没有添加任何东西"时,我并不是说"我们不会在通常的开发中使用它们".
我的意思是,即使没有这些方法,我们也可以获得这些"围栏".如果我是正确的,实际上,读取一个虚拟的volatile会产生loadFence()的效果,而写一个虚拟的volatile会产生fullFence()的效果,而unsafe.putOrderedXXX()(或者AtomicInteger.lazySet())会产生效果. storeFence().
它们可能有细微差别,但在目前的实施中,它们是可交换的.(链接暗示似乎)
这就是我所说的"他们没有添加任何新东西".
另一个编辑
这已经修复了.
请参阅https://bugs.openjdk.java.net/browse/JDK-8038978
谢谢@ john-vint
在JDK 8中,StringBuffer类有一个toStringCache,而StringBuilder没有.
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
Run Code Online (Sandbox Code Playgroud)
但为什么?
我能想到的一个可能原因是StringBuffer已经同步,因此可以更容易地实现缓存.
或者也许历史上StringBuffer是以这种方式实现的,所以旧代码在很大程度上依赖于这个功能?
鉴于具有逃逸分析和偏向锁定的现代JVM,差异是否相关?
我阅读了http://blog.qt.digia.com/blog/2011/06/10/type-punning-and-strict-aliasing/,发现了这段代码.
QDataStream &QDataStream::operator>>(qint16 &i)
{
...
register uchar *p = (uchar *)(&i);
char b[2];
if (dev->read(b, 2) == 2) {
*p++ = b[1];
*p = b[0];
...
Run Code Online (Sandbox Code Playgroud)
作者声称MSVC优化了我觉得很奇怪的任务.
MSVC真的利用严格的别名规则吗?
是不是uchar*特别允许用来做打字?
据我所知,PKCS 8 常用于存储私钥,PKCS 12 常用于存储证书。
要与 APN 通信,您需要身份验证令牌或证书。
这是否意味着那些 .p8 文件是用于创建令牌的密钥,而那些 .p12 文件是用作证书?
kafka是否适合互联网使用?
更准确地说,我想要将kafka主题公开为“公共接口”,然后外部使用者(或生产者)可以连接到它。可能吗?
如果我想同时在内部和外部网络中使用群集,我会听到一些问题,因为这样很难配置advertised.host.name。真的吗?
我还必须暴露动物园管理员吗?我认为新的消费者/生产者api不再需要它。
java ×2
apache-kafka ×1
c ×1
c++ ×1
java-8 ×1
mingw-w64 ×1
nat ×1
stringbuffer ×1
unsafe ×1
wan ×1