将二次贝塞尔曲线(3点)转换为立方贝塞尔曲线(4点)的算法是什么?
下面的代码通过一些位攻击执行快速反平方根操作.该算法可能是由Silicon Graphics在1990年代早期开发的,它也出现在Quake 3中. 更多信息
但是我从GCC C++编译器收到以下警告:解除引用类型惩罚指针将破坏严格别名规则
我应该使用static_cast,reinterpret_cast还是dynamic_cast在这种情况下使用?
float InverseSquareRoot(float x)
{
float xhalf = 0.5f*x;
int32_t i = *(int32_t*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}
Run Code Online (Sandbox Code Playgroud) c++ strict-aliasing gcc-warning undefined-behavior type-punning
我有一个链接到主要目标的OBJECT库.该有一个相关库,说.如果我们使用遗留变量,那么很容易:objlibmaintargetobjlibZLIB<package-name>_*
add_library(objlib OBJECT ...)
target_include_directories(objlib ${ZLIB_INCLUDE_DIRS})
...
add_executable(maintarget $<TARGET_OBJECTS:objlib>)
target_link_libraries(maintarget ${ZLIB_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
但我想将依赖项用作IMPORTED库,因为它更简洁(创建配置模块的便捷方式,即使用install(EXPORT ...),就是这样).
以下代码不起作用,因为target_link_libraries不能与OBJECT库一起使用:
add_library(objlib OBJECT ...)
target_link_libraries(objlib ZLIB::ZLIB)
Run Code Online (Sandbox Code Playgroud)
链接ZLIB::ZLIB到maintarget也不行,objlib没有得到包括目录:
add_library(objlib OBJECT ...)
...
add_executable(maintarget $<TARGET_OBJECTS:objlib>)
target_link_libraries(maintarget ZLIB::ZLIB)
Run Code Online (Sandbox Code Playgroud)
使用中间INTERFACE库(objlib-wrapper)进行黑客攻击也不起作用.
唯一有效的方法是查询IMPORTED库的属性并重新生成<package-name>_*变量中通常可用的信息.这是一个讨厌的解决方法.
有没有更好的办法?
我发现了一篇有趣的关于SIMD陷阱的Gamasutra文章,该文章指出__m128使用包装类型无法达到"纯" 类型的性能.我对此持怀疑态度,因此我下载了项目文件并制作了一个类似的测试用例.
事实证明(令我惊讶的是)包装版本明显变慢了.由于我不想谈论空气稀薄,测试案例如下:
在第一种情况下, Vec4是一个__m128带有一些运算符的类型的简单别名:
#include <xmmintrin.h>
#include <emmintrin.h>
using Vec4 = __m128;
inline __m128 VLoad(float f)
{
return _mm_set_ps(f, f, f, f);
};
inline Vec4& operator+=(Vec4 &va, Vec4 vb)
{
return (va = _mm_add_ps(va, vb));
};
inline Vec4& operator*=(Vec4 &va, Vec4 vb)
{
return (va = _mm_mul_ps(va, vb));
};
inline Vec4 operator+(Vec4 va, Vec4 vb)
{
return _mm_add_ps(va, vb);
};
inline Vec4 operator-(Vec4 va, Vec4 vb)
{
return _mm_sub_ps(va, vb); …Run Code Online (Sandbox Code Playgroud) 什么是迭代std::set/ std::multiset/ std::map/ 的时间复杂度std::multimap?我相信它在集合/地图的大小上是线性的,但不是那么肯定.是否在语言标准中指定?
我知道以下C++代理方法:
.与纯虚函数的接口
.Boost.Function
.最快可能的C++代表
.不可能快速的C++代表
.快速C++代表
.Fast C++ Delegate:Boost.Function'drop-in'替换和多播
每个都有其优点和缺点.有些更快,有些更灵活,有些更丰富,有些更符合标准,有些更便携,但我个人觉得自己喜欢第三种:Sergey Ryazanov的不可能快速的C++代表.但问题是他的代表不具备可比性:
我的代表无法比较.未定义比较运算符,因为委托不包含指向方法的指针.存根函数的指针在各种编译单元中可以不同.
读者回答了哪一个:
"在各种编译单元中,指向存根函数的指针可能不同." AFAIK,这不是真的.编译器需要重复使用在不同编译单元中生成的模板函数(我确信 - 但我认为Borland曾违反此规则).我认为这是因为类(不在"无名"命名空间中)使用外部链接,并且使用存根函数的方式总是会阻止它们被内联(尽管这不应该是一个问题,因为它取了函数的地址将强制生成非内联版本,并且链接器执行的"外部链接"将消除除一个类似命名的函数之外的所有函数(假定它们并且标准要求它们相同))...
如果您定义一个转换单元(cpp文件)的模板函数,然后在另一个转换单元中以不同方式定义相同的函数,则两个版本中只有一个将使其成为最终的可执行文件.(这实际上违反了"一个定义规则",但适用于GCC,至少......不确定MSVC.)重点是:[存根]的地址在不同的单位中是相同的.
如果您发现MSVC属实,我会敦促您更新文章(包括比较功能) - 如果MSVC是标准授权,就此而言.
现在这篇文章已有四年了,作者在过去三年左右没有回复任何评论,所以我想知道上述评论是否有任何优点,以及这个具体实施是否确实可以改为支持比较.C++标准是否明确禁止此类使用?如果是这样,那么最近的编译器是否在这方面符合标准?
谢谢.
根据cppreference,该特性std::is_literal_type在C++ 17中已被弃用.问题是为什么以及什么是未来的首选替代品来检查类型是否是文字类型.
SSE2具有在单精度浮点数和32位整数之间转换向量的指令.
_mm_cvtps_epi32()_mm_cvtepi32_ps()但是没有双精度和64位整数的等价物.换句话说,他们失踪了:
_mm_cvtpd_epi64()_mm_cvtepi64_pd()似乎AVX也没有它们.
模拟这些内在函数的最有效方法是什么?
有没有办法从C++通过node.js调用JS函数(作为回调或类似的东西)?如果有,怎么样?我在网上搜索它,但没有找到任何有用的资源.
提前致谢
我想将两个__m128值组合成一个__m256.
像这样的东西:
__m128 a = _mm_set_ps(1, 2, 3, 4);
__m128 b = _mm_set_ps(5, 6, 7, 8);
Run Code Online (Sandbox Code Playgroud)
类似于:
__m256 c = { 1, 2, 3, 4, 5, 6, 7, 8 };
Run Code Online (Sandbox Code Playgroud)
我可以使用任何内在函数来做到这一点吗?
c++ ×8
sse ×3
avx ×2
c ×2
simd ×2
std ×2
x86 ×2
algorithm ×1
assembly ×1
big-o ×1
c++17 ×1
cmake ×1
delegates ×1
deprecated ×1
gcc-warning ×1
graphics ×1
javascript ×1
node.js ×1
optimization ×1
stl ×1
type-punning ×1
type-traits ×1
vector ×1