你能列出实际差异/暗示的子弹清单吗?我阅读了相关的MSDN文章,但我理解异步异常仍然有点模糊.
我正在使用Boost.Test编写测试套件,我的编译器发出警告,应该启用EHa:
警告C4535:调用_set_se_translator()需要/ EHa
项目本身仅使用普通异常(来自STL)并且不需要/ EHa切换.我是否必须使用/ EHa开关重新编译它以使测试套件正常工作?我的感觉是我只需要/ EHa参加测试.
通过值传递对齐类型或结构与对齐类型不适用于某些实现.这会破坏STL容器,因为某些方法(例如resize)会按值获取它们的参数.
我使用Visual Studio 2008运行一些测试,并不完全确定何时以及如何通过值失败.我主要担心的是函数foo.它似乎工作正常,但它可能是内联或其他巧合的结果?如果我将其签名更改为void foo(const __m128&)怎么办?
非常感谢您的意见.谢谢.
struct A
{
__m128 x;
int n;
};
void foo(__m128);
void bar(A);
void f1()
{
// won't compile
// std::vector<A> vec1(3);
// compiles, but fails at runtime when elements are accessed
std::vector<__m128> vec2(3);
// this seems to work. WHY???
std::vector<__m128, some_16_byte_aligned_allocator<__m128> > vec3(3);
__m128 x;
A a;
// passed by value, is it OK?
foo(x);
// won't compile
//bar(a);
}
Run Code Online (Sandbox Code Playgroud)
编辑.即使使用对齐的分配器,STL也会失败,因为仍然存在按值传递问题.
发现此链接按值传递__m128
我需要开源(没有许可限制)日志功能的实现,有签名的东西
__m128d _mm_log_pd(__m128d);
Run Code Online (Sandbox Code Playgroud)
它可以在英特尔短矢量数学库(ICC的一部分)中使用,但ICC既不是免费的也不是开源的.我正在寻找仅使用内在函数的实现.
它应该使用特殊的有理函数近似.我需要的东西几乎与cmath日志一样准确,比如9-10十进制数字,但更快.
一行代码值千言万语:)这是我的问题:
/* Platform specific 16-byte alignment macro switch.
On Visual C++ it would substitute __declspec(align(16)).
On GCC it substitutes __attribute__((aligned (16))).
*/
#define ALIGN_16 ...
struct ALIGN_16 A {...};
A* ptr = new A;
A* ptr2 = new A[20];
assert(size_t(ptr) % 16 == 0);
for (int i=0; i<20; ++i)
assert(size_t(ptr2+i) % 16 == 0);
assert(sizeof(A) % 16 == 0);
Run Code Online (Sandbox Code Playgroud)
我可以期望所有断言都通过SSE支持的平台吗?谢谢.
编辑.部分答案.我用VS2008,GCC和ICC进行了一些测试.MS编译器确实对齐了ptr和ptr2,但是GCC和ICC未能对齐ptr2.
有人可以向C++程序员解释Java(和C#)引用和shared_ptr(来自Boost或来自C++ 0x)之间最重要的区别.
我或多或少知道如何实现shared_ptr.我很好奇以下几个方面的差异:
1)表现.2)骑自行车.shared_ptr可以循环(A和B保持彼此的指针).在Java中可以骑自行车吗?3)还有别的吗?
谢谢.
这合法吗?如果是这样,你认为它是一个好的编码实践吗?
我想做这样的事情(不显示不重要的细节):
class ItemStorage {
int size() const;
};
class SpecialStorage : public ItemStorage {
public:
SpecialStorage (...) : ItemStorage(...), items(ItemStorage::size()) {...}
private:
int items;
};
Run Code Online (Sandbox Code Playgroud)
如果方法大小不是虚拟的,我很确定它是可以的.如果它是虚拟的并且派生类不会覆盖它怎么办?
两个相关的问题.
这就是我的代码需要处理相当大量的数据.它在内部循环中完成,性能很重要.
基本上,我需要具有以下签名的功能:
void convert_int_to_double(__int32 const * input, double * output);
void convert_float_to_double(float const * input, double * output);
Run Code Online (Sandbox Code Playgroud)
输入和输出指针是对齐的,元素的数量是4的倍数.主要问题是如何快速将__m128解压缩为两个__m128d.