小编nty*_*sdd的帖子

idiv指令的结果不同

看看这段代码

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)

c integer-division undefined-behavior mingw-w64

13
推荐指数
1
解决办法
454
查看次数

Java Unsafe.storeFence()文档错了吗?

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

java multithreading unsafe memory-fences

11
推荐指数
1
解决办法
852
查看次数

为什么StringBuffer有一个toStringCache而StringBuilder没有?

在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,差异是否相关?

java stringbuilder stringbuffer java-8

6
推荐指数
1
解决办法
460
查看次数

这段代码打破了严格的别名规则?

我阅读了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*特别允许用来做打字?

c++ strict-aliasing

5
推荐指数
1
解决办法
159
查看次数

在 APNs 的上下文中,p8 和 p12 是否分别表示基于令牌和证书的身份验证?

据我所知,PKCS 8 常用于存储私钥,PKCS 12 常用于存储证书。

要与 APN 通信,您需要身份验证令牌或证书。

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

这是否意味着那些 .p8 文件是用于创建令牌的密钥,而那些 .p12 文件是用作证书?

authentication apple-push-notifications

3
推荐指数
2
解决办法
3615
查看次数

我可以通过互联网使用kafka吗?

kafka是否适合互联网使用?

更准确地说,我想要将kafka主题公开为“公共接口”,然后外部使用者(或生产者)可以连接到它。可能吗?

如果我想同时在内部和外部网络中使用群集,我会听到一些问题,因为这样很难配置advertised.host.name。真的吗?

我还必须暴露动物园管理员吗?我认为新的消费者/生产者api不再需要它。

authentication cluster-computing nat wan apache-kafka

2
推荐指数
3
解决办法
3844
查看次数