在C#中,对于具有getter和setter的字段,有一个很好的语法糖.而且,我喜欢允许我编写的自动实现的属性
public Foo foo { get; private set; }
Run Code Online (Sandbox Code Playgroud)
在C++中我必须写
private:
Foo foo;
public:
Foo getFoo() { return foo; }
Run Code Online (Sandbox Code Playgroud)
在C++ 11中是否有一些这样的概念允许我对此有一些语法糖?
我正在尝试使用JDK9的新AOT功能编译应用程序服务器,并且面临着许多挑战.
应用程序服务器包含~180 MB的罐子; 编译一起溢出整数,所以我试图将每个模块编译成一个(.so)库.这些模块与其他模块有依赖关系,所以我不得不使用-J-cp -J依赖项将它们放在classpath上.这导致了4.4 GB的libs - 因为AOT应该加速服务器启动,你可以想象从磁盘加载它并没有真正帮助.(可以剥离那些调试信息的库,但我们仍然在讨论与罐子相比规模增长的顺序.)
我很沮丧,jaotc实际上类加载编译的类,它触发静态构造函数(这有时会给我错误).此外,编译器无法处理缺少的引用类,有时这只是一个运行时依赖 - 即使没有它们,服务器也可以正常运行.所以我必须提供空的模拟类来满足编译器.
但是,当使用AOT跟踪(-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none而不是stdout -XX:+PrintAOT)运行服务器时,我发现libs也包含一些依赖项:
found java.lang.Object in /home/user/aot/common/libjava.base-coop.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found java.lang.Object in /home/user/aot/appserver/lib/libcom.example.module1.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found java.lang.Object in /home/user/aot/appserver/lib/libcom.example.module2.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
Run Code Online (Sandbox Code Playgroud)
这证实了我的疑问,lib只包含了我给编译器编译的jar中的代码,但至少包含了超类的代码.我也不确定JVM在多个库中找到相同类时的行为.
剥离重复是否可能?大/多库项目的推荐方法是什么?
我已经在一个项目中编写了一个跨越数千个修改行的功能,现在这一切都以一次大提交结束(我已经压缩了正在进行的提交)。现在我想将更改拆分为多个提交,以便于审查/可能多个 PR。
有些文件包含多个更改,这些更改应该在不同的提交中结束,因此我正在寻找使用三窗格视图的所见即所得编辑器,这将允许我将一些行移动到中间提交,同时查看以前和将来的版本(+一些手册变化)。我使用 IntelliJ IDEA 进行开发,所以我想象了类似于冲突解决对话框的东西。
我可以切换到不同的分支/标记单提交版本并执行 Git->与分支比较(并从那里获取更改),但我正在寻找更方便的东西。
虽然这可能被标记为偏离主题/固执己见,但我相信针对不同工作流程的中立建议可能是有价值的。
我试图以这种方式使用C++ 0x初始化列表作为构造函数调用的参数:
Foo<float> foo("Foo 1", std::vector<const char *>({ "foo A", "foo B" }) );
Run Code Online (Sandbox Code Playgroud)
与构造函数
Foo(const char *name, std::vector<const char *> &foos)
Run Code Online (Sandbox Code Playgroud)
使用此构造函数,编译器抱怨:
error: no matching function for call to Foo<float>::Foo(
const char [5], std::vector<const char *, std::allocator<const char *> >)
note: candidates are: Foo<T>::Foo(const char *, std::vector<const char *,
std::allocator<const char *> >&) [with T = float]
Run Code Online (Sandbox Code Playgroud)
但是,当我将构造函数更改为
Foo(const char *name, std::vector<const char *> foos)
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.为什么第一个构造函数不起作用?我认为矢量可以在构造函数调用的位置构造并通过引用传递下来,但显然存在一些问题.有人可以解释一下吗?
谢谢
顺便说一句.我使用的是g ++版本4.4.5
编辑: 感谢下面的正确答案,我也发现了为什么我不能这样做.
我试图在OpenCL中编写MergeSort(我知道,BitonicSort更快,但我想比较它们),目前我遇到了一个奇怪的问题:
如果我将全局大小设置为1 << 24和本地大小为512,则内核无法执行,也无法执行下一个排队的内核.但是,在排队内核或等待队列完成时,我都不会收到任何错误.没什么,只是内核没有被执行.ComputeProfiler也显示它 - 没有内核.但是,对于全局大小1 << 23,算法运行良好.使用本地大小256,最小失败的全局大小是1 << 23.
为什么会这样?我认为至少可以有65535工作组(根据NVidia编程指南),向下舍入到最接近2的幂32768 == 1 << 15,本地大小512 == 1 << 9这意味着具有全局大小1 << 24应该仍然可以.此外,我可以使用此全局和本地大小执行另一个内核.
最重要的是,没有错误,我无法察觉到这种情况已经发生.可能我必须做一些解决方法(在大型集合中手动循环工作组)但我想了解问题.
谢谢你的任何建议
PS:我在Linux机器上使用NVidia GTX 580,驱动程序为260.19.26.
我刚尝试std::sort对两者std::vector<std::pair<float, unsigned int>>(填充push_back操作)和普通std::pair<float, unsigned int>> *数组(使用new分配然后逐个填充)进行基准测试.比较函数只比较了对的浮动部分.
令人惊讶的是,当在16M值上使用时,在std :: vector上它只需要大约1940毫秒,但在阵列上它大约是2190毫秒.谁能解释一下矢量怎么能更快?是由于缓存,还是只是std :: sort的数组版本实现不好?
gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6)
Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz - cache size 8192 KB (计算机有两个四核CPU,但我认为排序只是单线程)
编辑:现在你可以叫我dumbass,但是当我试图重现我用于测量的代码时(我已经删除了原始代码)我无法重现结果 - 现在数组版本需要大约1915 + - 5ms(测量时间) 32次运行).我只能发誓我已经对10次测量进行了三次测试(手动)并得到了类似的结果,但这并不是一个严格的证据.
原始代码中可能存在一些错误,后台进程似乎无法进行,因为我已经交替测量了向量和数组版本,并且向量结果保持并且没有用户登录.
请将此问题视为已结束.谢谢你的努力.
在 Java 8 中,我在java.util.concurrent.ConcurrentMap接口上实现了一个包装器,特别是remove(Object key)方法。由于我需要在删除过程中进行更多检查,因此我需要使用以下命令来实现该功能
compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
然而,这里的问题是:我必须接受Object但将其传递给computeas K。对于泛型,我什至无法进行运行时检查,例如if (key instanceof K) ...
compute我明白为什么选择这样的签名;如果只是Object,万一计算需要创建一个新条目,它就不能简单地使用该密钥。但我不确定如何解决这个问题 - 是否有任何推荐的模式,但使用多个调用,如下所示?
for (;;) {
V v = map.get();
if (check(k, v)) {
if (map.remove(k, v)) return true;
} else return false;
}
Run Code Online (Sandbox Code Playgroud)
谢谢
java collections concurrenthashmap java.util.concurrent java-8
反汇编一些Java 8代码我发现invokestatic接口中的一些静态方法调用(特别是这个java.util.function.Function.identity())在const pool中使用了InterfaceMethodRef; 这是javap -s -c -v p告诉我的:
15: invokestatic #66 // InterfaceMethod java/util/function/Function.identity:()Ljava/util/function/Function;
Run Code Online (Sandbox Code Playgroud)
根据JVM 8规范,这是不可能的,当我在带有Java 7(major version=51)版本的classfile中使用此指令时,它已在此指令上抛出VerifyError.
但是,当我将主要版本更改为时52,它开始像魅力一样工作.请注意,我在Oracle JDK 1.8.0_60上运行.我想知道为什么需要进行这种更改(调用的方法是静态链接的,不是吗?)以及是否记录在任何地方.
由于SUREFIRE-938,测试的输出缓冲在 /tmp/stdout*deferred 中以创建 XML 报告。我对 XML 或任何其他形式的报告不感兴趣,但我在测试执行期间收集了千兆字节的日志,并将它们也写入 /tmp。有时缓冲区文件和输出日志的总大小太大,不适合 - 有没有办法禁用报告和所有这些缓冲(这也会减慢测试速度)?