小编Tav*_*nes的帖子

为什么gcc不能矢量化这个直线代码?

我有以下代码,这似乎是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)

计算uv似乎很容易矢量化,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)

c gcc vectorization

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

使用替换的运算符new进行Clang链接时优化会导致valgrind中的free()/ delete不匹配

当使用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)

c++ valgrind clang lto

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

是否对不同语言的初始列表容量进行了比较?

我正在寻找不同语言的初始列表容量的比较,甚至可能为什么选择这些大小.例如,我知道在Java 7中,a的默认容量ArrayList将为10(一旦插入内容).如果可能的话,尺寸增加的因素也很好.对于Java 7,该因子为1.5.

我主要对其他几种流行语言感兴趣,尤其是Python.

list arraylist dynamic-arrays

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

其他等效的有符号和无符号类型的别名

C 和 C++ 标准都允许相同整数类型的有符号和无符号变体互为别名。例如,unsigned int*int*5别名。但这并不是故事的全部,因为它们显然具有不同范围的可表示值。我有以下假设:

  • 如果unsigned int通过 an 读取 an int*,则该值必须在 的范围内,int否则会发生整数溢出且行为未定义。这样对吗?
  • 如果 anint是通过 an 读取的unsigned int*,负值会环绕,就好像它们被强制转换为unsigned int。这样对吗?
  • 如果该值是二者的范围内intunsigned int,通过任一类型的指针访问它被完全定义,并给出了相同的值。这样对吗?

此外,兼容但不等效的整数类型呢?

  • intlong具有相同范围、对齐方式等的系统上,可以int*long*别名吗?(我认为不是。)
  • 可以char16_t*uint_least16_t*别名吗?我怀疑这在 C 和 C++ 之间有所不同。在 C 中,char16_tuint_least16_t(正确的?)的 typedef 。在 C++ 中,char16_t是它自己的原始类型,它与uint_least16_t. 与 C 不同,C++ 似乎也不例外,允许兼容但不同的类型别名。

c c++ language-lawyer

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

C++中不可变对象的可变容器

我想要一些等同于C++ std :: vector的东西,其中底层对象是不可变的.所以我可以将push_back()项添加到向量等等.实际的std :: vector维护一个下面的数组,该数组大于向量的大小,填充了默认的构造对象,当你使用push_back()时,它会对数组中元素的赋值.我的不可变对象没有默认构造函数,赋值是一个变异操作,因此也是如此.

我可以做一个vector<boost::optional<T>>,但这是一个混乱的界面,因为我只想将有效构造的对象放入向量中,并且只从向量中获取它们.

我认为加强有类似的东西,但我找不到它.这样的事情存在吗?

c++

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

是否可以在RTLD_LOCAL加载的库中合并弱符号,如vtables/typeinfo?

对于上下文:我有一个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_caststd::bad_any_cast尽管类型是正确的,但仍在抛出.我追踪到这样一个事实,即两个库对该类型的typeinfo有不同的定义,并且它们没有在运行时合并.这似乎是因为System.load()最终调用dlopen()RTLD_LOCAL而非RTLD_GLOBAL.

我写这个来演示不需要JNI的行为:

foo.hpp

class foo { };

extern "C" const void* libfoo_foo_typeinfo();
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

#include "foo.hpp"
#include <typeinfo>

extern "C" const void* libfoo_foo_typeinfo()
{
    return &typeid(foo);
}
Run Code Online (Sandbox Code Playgroud)

bar.cpp

#include "foo.hpp"
#include <typeinfo>

extern "C" const void* libbar_foo_typeinfo()
{
    return &typeid(foo);
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include <iostream>
#include <typeinfo>
#include <dlfcn.h>

int main() {
    void* libfoo = dlopen("./libfoo.so", RTLD_NOW | …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface rtti dlopen android-ndk

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

类型推断选择了错误的超级特征

这段代码:

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>也可用的 …

type-inference rust

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

使用MinGW-W64的LTO的DLL链接失败

我未能使用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)

c++ mingw mingw-w64 lto

4
推荐指数
1
解决办法
991
查看次数

如何为Joda的DateTime.parse()设置默认时区

我想使用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的默认时区.

java jodatime

3
推荐指数
1
解决办法
847
查看次数

Guice Multibindings:从 Injector 手动获取 Set&lt;T&gt;

使用 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)

java generics guice

3
推荐指数
1
解决办法
2020
查看次数