我有以下代码,这似乎是SLP的完美候选:
struct vector {
double x, y, z;
} __attribute__((aligned(16)));
int
slp_test(struct vector *x0, struct vector *n)
{
double t = -x0->z/n->z;
double u = x0->x + t*n->x;
double v = x0->y + t*n->y;
return t >= 0.0 && u >= 0.0 && v >= 0.0 && u + v <= 1.0;
}
Run Code Online (Sandbox Code Playgroud)
计算u和v似乎很容易矢量化,x0并且n应该足够好地对齐它.但是在x86-64 at -O3,gcc 4.9.0生成了这段代码:
movsd .LC0(%rip), %xmm1
movsd 16(%rdi), %xmm0
movsd (%rdi), %xmm2
xorpd %xmm1, %xmm0
movsd (%rsi), …Run Code Online (Sandbox Code Playgroud) 当使用clang 3.5.0和-flto并使用共享库进行链接时,共享库中的调用似乎operator delete不会遵循与operator new主对象的调用相同的符号解析顺序.例:
shared.cpp:
void deleteIt(int* ptr) {
delete ptr;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp:
#include <cstdlib>
#include <new>
void* operator new(size_t size) {
void* result = std::malloc(size);
if (result == nullptr) {
throw std::bad_alloc();
}
return result;
}
void operator delete(void* ptr) noexcept {
std::free(ptr);
}
void deleteIt(int* ptr);
int main() {
deleteIt(new int);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我构建它并通过valgrind运行时会发生的事情:
$ clang++ -std=c++11 -g -O3 -flto -fuse-ld=gold -fPIC -shared shared.cpp -o libshared.so
$ clang++ -std=c++11 -g -O3 …Run Code Online (Sandbox Code Playgroud) 我正在寻找不同语言的初始列表容量的比较,甚至可能为什么选择这些大小.例如,我知道在Java 7中,a的默认容量ArrayList将为10(一旦插入内容).如果可能的话,尺寸增加的因素也很好.对于Java 7,该因子为1.5.
我主要对其他几种流行语言感兴趣,尤其是Python.
C 和 C++ 标准都允许相同整数类型的有符号和无符号变体互为别名。例如,unsigned int*和int*5别名。但这并不是故事的全部,因为它们显然具有不同范围的可表示值。我有以下假设:
unsigned int通过 an 读取 an int*,则该值必须在 的范围内,int否则会发生整数溢出且行为未定义。这样对吗?int是通过 an 读取的unsigned int*,负值会环绕,就好像它们被强制转换为unsigned int。这样对吗?int和unsigned int,通过任一类型的指针访问它被完全定义,并给出了相同的值。这样对吗?此外,兼容但不等效的整数类型呢?
int和long具有相同范围、对齐方式等的系统上,可以int*和long*别名吗?(我认为不是。)char16_t*和uint_least16_t*别名吗?我怀疑这在 C 和 C++ 之间有所不同。在 C 中,char16_t是uint_least16_t(正确的?)的 typedef 。在 C++ 中,char16_t是它自己的原始类型,它与uint_least16_t. 与 C 不同,C++ 似乎也不例外,允许兼容但不同的类型别名。我想要一些等同于C++ std :: vector的东西,其中底层对象是不可变的.所以我可以将push_back()项添加到向量等等.实际的std :: vector维护一个下面的数组,该数组大于向量的大小,填充了默认的构造对象,当你使用push_back()时,它会对数组中元素的赋值.我的不可变对象没有默认构造函数,赋值是一个变异操作,因此也是如此.
我可以做一个vector<boost::optional<T>>,但这是一个混乱的界面,因为我只想将有效构造的对象放入向量中,并且只从向量中获取它们.
我认为加强有类似的东西,但我找不到它.这样的事情存在吗?
对于上下文:我有一个Java项目,部分用两个JNI库实现.例如,libbar.so取决于libfoo.so.如果这些是系统库,
System.loadLibrary("bar");
Run Code Online (Sandbox Code Playgroud)
会做的伎俩.但由于它们是我自己的JAR附带的自定义库,我必须做类似的事情
System.load("/path/to/libfoo.so");
System.load("/path/to/libbar.so");
Run Code Online (Sandbox Code Playgroud)
libfoo需要先行,因为否则libbar无法找到它,因为它不在系统库搜索路径中.
这已经运作了一段时间,但我现在遇到了一个问题,std::any_cast即std::bad_any_cast尽管类型是正确的,但仍在抛出.我追踪到这样一个事实,即两个库对该类型的typeinfo有不同的定义,并且它们没有在运行时合并.这似乎是因为System.load()最终调用dlopen()与RTLD_LOCAL而非RTLD_GLOBAL.
我写这个来演示不需要JNI的行为:
foo.hpp
Run Code Online (Sandbox Code Playgroud)class foo { }; extern "C" const void* libfoo_foo_typeinfo();Foo.cpp中
Run Code Online (Sandbox Code Playgroud)#include "foo.hpp" #include <typeinfo> extern "C" const void* libfoo_foo_typeinfo() { return &typeid(foo); }bar.cpp
Run Code Online (Sandbox Code Playgroud)#include "foo.hpp" #include <typeinfo> extern "C" const void* libbar_foo_typeinfo() { return &typeid(foo); }main.cpp中
Run Code Online (Sandbox Code Playgroud)#include <iostream> #include <typeinfo> #include <dlfcn.h> int main() { void* libfoo = dlopen("./libfoo.so", RTLD_NOW | …
这段代码:
trait Foo: PartialOrd + PartialOrd<<Self as Foo>::A> {
type A;
}
trait Bar {
type B: Foo;
fn bar(&self) -> Self::B;
}
fn baz<T: Bar>(x: T, y: T) -> bool {
x.bar() < y.bar()
}
Run Code Online (Sandbox Code Playgroud)
无法编译并出现此错误:
trait Foo: PartialOrd + PartialOrd<<Self as Foo>::A> {
type A;
}
trait Bar {
type B: Foo;
fn bar(&self) -> Self::B;
}
fn baz<T: Bar>(x: T, y: T) -> bool {
x.bar() < y.bar()
}
Run Code Online (Sandbox Code Playgroud)
这似乎暗示类型推断正在尝试调用B: PartialOrd<B::A>impl 而不是B: PartialOrd<B>也可用的 …
我未能使用MinGW-W64为Windows x86-64构建共享库-flto。这是我得到的(在Linux机器上完成编译):
# ...
x86_64-w64-mingw32-g++ -c -std=gnu++11 -fvisibility=hidden -DGLEW_STATIC -Ofast -flto -frtti -pedantic -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -I'include' -I'/usr/x86_64-w64-mingw32/share/qt4/mkspecs/win32-g++-cross-x64' -o build/Point3D.o src/Point3D.cpp
x86_64-w64-mingw32-g++ -mwindows -Ofast -flto -shared -Wl,-subsystem,windows -mthreads -Wl,--out-implib,lib/libglengine.a -o lib/glengine.dll object_script.glengine.Release -lopengl32 -Wl,-Bstatic -lturbojpeg -lpng -lwebpdecoder
Cannot export _ZNSt6vectorI6StringSaIS0_EE19_M_emplace_back_auxIJRKS0_EEEvDpOT_: symbol wrong type (4 vs 3)
Cannot export _ZNSt6vectorIPN3GLE6ShaderESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_: symbol wrong type (4 vs 3)
Cannot export _ZNSt6vectorIPN3GLE7ProgramESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_: symbol wrong type (4 vs 3)
collect2: error: ld returned 1 exit status
Makefile.Release:211: recipe for …Run Code Online (Sandbox Code Playgroud) 我想使用Joda Time来解析没有具有特定默认区域(例如UTC)的显式时区的时间,但是如果存在则使用显式区域.例如:
parse("2014-02-11T12:00:00") // Should be UTC
parse("2014-02-11T12:00:00+02:00") // Should be +2 hours
Run Code Online (Sandbox Code Playgroud)
我尝试的一切都有一些问题:
DateTime.parse("2014-02-11T12:00:00") // Gives the server time zone, -5 hours
ISODateTimeFormat.dateTimeParser()
.withZone(DateTimeZone.UTC)
.parseDateTime("2014-02-11T12:00:00+02:00"); // Gives UTC
Run Code Online (Sandbox Code Playgroud)
基本上我想要withZone()和withOffsetParsed()同时的行为,但他们互相覆盖.
我不想更改整个JVM的默认时区.
使用 guice Multibindings 扩展可以注入特定类型的 Set 而不是该类型的单个实例。我如何使用 Injector.getInstance(...) 从 Injector 手动获取这个 Set?到目前为止,我的尝试导致了一个带有消息的 ConfigurationException:
java.util.Set<T> 不能用作键;它没有完全指定。
public final <T> Iterator<T> loadServices(Class<T> type) {
final TypeLiteral<Set<T>> lit = new TypeLiteral<Set<T>>() {};
final Key<Set<T>> key = Key.get(lit);
final Set<T> bindings = this.injector.getInstance(key);
return bindings.iterator();
}
Run Code Online (Sandbox Code Playgroud)