假设我有一些功能模板f1:
template<typename f2>
int f1(int i, int j) noexcept {
return i + j + f2(i, j);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法确定是否f2(i, j)可以constexpr.(无论它是函数还是函子),所以也标记f1<f2>为constexpr?
我想在这里使用SFINAE一些如何,但没有找到如何检测constexpr使用类型特征
这是一个经验假设(分配比解除分配更快).
这也是我猜的原因之一,为什么基于堆的存储(如STL容器或其他)选择不将当前未使用的内存返回给系统(这就是为什么缩小适应成语诞生的原因).
当然,我们不应该混淆' 堆 '内存与' 堆 '类似的数据结构.
那么为什么解除分配速度较慢?
它是Windows特定的(我在Win 8.1上看到它)还是OS独立的?
是否有一些C++特定的内存管理器自动涉及使用' new '/' delete '或整个mem.管理完全依赖于操作系统?(我知道C++ 11引入了一些垃圾收集支持,我从未真正使用过,更好地依赖于旧堆栈和静态持续时间或自我管理容器和RAII).
另外,在FOLLY字符串的代码中,我看到使用旧的C堆分配/解除分配,它是否比C++' new '/' delete ' 快?
PS请注意,问题不是关于虚拟内存机制,我知道用户空间程序没有使用真正的内存.addresation.
我发现这个 "快速strlen函数"实现:
// for x86 only
size_t my_strlen(const char *s) {
size_t len = 0;
for(;;) {
unsigned x = *(unsigned*)s;
if((x & 0xFF) == 0) return len;
if((x & 0xFF00) == 0) return len + 1;
if((x & 0xFF0000) == 0) return len + 2;
if((x & 0xFF000000) == 0) return len + 3;
s += 4, len += 4;
}
}
Run Code Online (Sandbox Code Playgroud)
这里使用的优化技术显然很简单:通过自然CPU字读取内存(代码是旧的并假定为x32 CPU),而不是简单的字节.
但是这段代码违反了别名规则,因此会导致未定义的行为,这些行为可以由编译器自由优化(那些使代码更快,但是更多).
我现在也看到它不可移植,因为它与little-endian endianness有关.
或者可能是我完全错了,上面的代码是正确的?这对C来说是否正确?对于C++?