小编Chr*_*ris的帖子

一些朋友的功能不符合规则

对于以下代码段:

class A{
    friend void f(){};
    public:
        A(){f();} //error
};

class B{
    friend void f(void* ptr){};
    public:
        B(){f(this);} //no error
};
Run Code Online (Sandbox Code Playgroud)

根据规则虽然可以在类中定义友元函数,但是在它们被声明到类范围之外的某个地方之前它们是不可见的,因此解释了类A的定义中的错误.
但我很困惑,为什么B类的片段不会产生与A类相同的错误.

请有人能告诉我这件事吗?

c++ friend

18
推荐指数
1
解决办法
558
查看次数

堆外,本机堆,直接内存和本机内存

最近,我在学习JVM内部时遇到了这些概念.我知道关于它们已经有很多关于它们的问题,但我仍然无法理解它们之间的关系,或者它们是什么.

现在我将它们描述为:

  1. 本机内存意味着正常JVM堆之外的内存区域,但仍然位于操作系统为JVM进程节省的总用户空间内存中(例如,在32位Windows上,它默认为2 GB).JVM保留此空间以存储一些内部数据,例如永久生成/方法区域等.
  2. 直接内存意味着你通过使用本机内存java.nio.DirectByteBuffer.

  3. 本机堆意味着您可以通过JNI代码中的本机内存unsafe.allocateMemory或仅使用本机内存malloc.

  4. 堆外与本机内存相同.

另外一个问题是,是否有可能直接在总内存空间(32位操作系统上为4GB)之外的内存中分配内存?

请指出我理解中的错误,如果可能的话,请对其进行清楚的描述.

java memory jvm

16
推荐指数
1
解决办法
1万
查看次数

Pattern.split比String.split慢

有两种方法:

private static void normalSplit(String base){
    base.split("\\.");
}

private static final Pattern p = Pattern.compile("\\.");

private static void patternSplit(String base){
    //use the static field above
    p.split(base);

}
Run Code Online (Sandbox Code Playgroud)

我在主方法中测试它们:

public static void main(String[] args) throws Exception{
    long start = System.currentTimeMillis();
    String longstr = "a.b.c.d.e.f.g.h.i.j";//use any long string you like
    for(int i=0;i<300000;i++){
        normalSplit(longstr);//switch to patternSplit to see the difference
    }
    System.out.println((System.currentTimeMillis()-start)/1000.0);
}
Run Code Online (Sandbox Code Playgroud)

直觉上,我认为String.split最终会Pattern.compile.split(在经过大量额外工作之后)做出真实的事情.我可以提前构造Pattern对象(它是线程安全的)并加速分裂.

但事实是,使用预先构建的Pattern 比直接调用要慢得多String.split.我在它们上尝试了一个长度为50个字符的字符串(使用MyEclipse),直接调用只消耗了使用预构建的Pattern对象的一半时间.

请有人能告诉我为什么会这样吗?

java regex string split

9
推荐指数
1
解决办法
557
查看次数

解释Michael&Scott无锁队列alorigthm

我正在研究迈克尔和斯科特的无锁队列算法,并尝试用C++实现它.

但我在我的代码中制作了一个竞赛,并认为算法中可能存在竞争.

我在这里阅读了论文: 简单,快速,实用的非阻塞和阻塞并发队列算法 和原始的Dequeue伪代码如下:

dequeue(Q: pointer to queue_t, pvalue: pointer to data type): boolean
D1:   loop                          // Keep trying until Dequeue is done
D2:      head = Q->Head             // Read Head
D3:      tail = Q->Tail             // Read Tail
D4:      next = head.ptr->next      // Read Head.ptr->next
D5:      if head == Q->Head         // Are head, tail, and next consistent?
D6:         if head.ptr == tail.ptr // Is queue empty or Tail falling behind?
D7:            if next.ptr == NULL  // Is queue empty?
D8: …
Run Code Online (Sandbox Code Playgroud)

queue concurrency nonblocking lock-free data-structures

9
推荐指数
2
解决办法
3243
查看次数

查看SDK源码时Android Studio报错

我使用的是 Android Studio 2.1.2,Android SDK 源文件中有许多“无法解析方法”错误:

在此处输入图片说明

与SO上的其他类似问题不同,此类错误不会出现在我自己的代码中,而只会出现在Android SDK源文件中。

虽然我的项目可以编译,但它们仍然很烦人,因为我无法按 Ctrl-单击来跟踪这些方法。

任何人都可以就此提出一些建议吗?

此外,我的项目面向 Android SDK 级别 23 并使用 JDK 1.7。

android android-studio android-studio-2.1

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