对于以下代码段:
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类相同的错误.
请有人能告诉我这件事吗?
最近,我在学习JVM内部时遇到了这些概念.我知道关于它们已经有很多关于它们的问题,但我仍然无法理解它们之间的关系,或者它们是什么.
现在我将它们描述为:
直接内存意味着你通过使用本机内存java.nio.DirectByteBuffer
.
本机堆意味着您可以通过JNI代码中的本机内存unsafe.allocateMemory
或仅使用本机内存malloc
.
堆外与本机内存相同.
另外一个问题是,是否有可能直接在总内存空间(32位操作系统上为4GB)之外的内存中分配内存?
请指出我理解中的错误,如果可能的话,请对其进行清楚的描述.
有两种方法:
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对象的一半时间.
请有人能告诉我为什么会这样吗?
我正在研究迈克尔和斯科特的无锁队列算法,并尝试用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) 我使用的是 Android Studio 2.1.2,Android SDK 源文件中有许多“无法解析方法”错误:
与SO上的其他类似问题不同,此类错误不会出现在我自己的代码中,而只会出现在Android SDK源文件中。
虽然我的项目可以编译,但它们仍然很烦人,因为我无法按 Ctrl-单击来跟踪这些方法。
任何人都可以就此提出一些建议吗?
此外,我的项目面向 Android SDK 级别 23 并使用 JDK 1.7。