我有一个带有乘法的最小表达模板库,即
template <typename T, typename U>
struct mul {
const T &v1;
const U &v2;
};
template <typename T, typename U>
mul<T, U> operator*(const T &one, const U &two) {
std::cout << " called: mul<T, U> operator*(const T &one, const T &two)\n";
return mul<T, U>{one, two};
}
Run Code Online (Sandbox Code Playgroud)
并转置,即
template <typename T>
struct transpose {
const T &t;
};
template <typename T>
transpose<T> tran(const T &one) {
return transpose<T>{one};
}
Run Code Online (Sandbox Code Playgroud)
我将介绍一些type A和B,其中后者是前者的子类:
template <typename T>
struct A { …Run Code Online (Sandbox Code Playgroud) 我今天通过分析对应于这个c ++示例的汇编代码开始学习x86汇编(我知道存在类似atoi但我希望保持示例最小化):
#include <vector>
std::vector<int> range(int N) {
std::vector<int> v(N);
for (unsigned int i = 0; i < N; ++i)
v[i] = i;
return v;
}
int main() {
return range(100).back();
}
Run Code Online (Sandbox Code Playgroud)
如果编译g++ -O0 -S -fno-stack-protector return_by_value.cpp,这导致这个摘录:
... <snip>
_Z5rangei:
.LFB509:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
.cfi_lsda 0x3,.LLSDA509
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $40, %rsp
.cfi_offset 3, -24
movq %rdi, -40(%rbp)
movl %esi, -44(%rbp)
leaq -25(%rbp), %rax
movq …Run Code Online (Sandbox Code Playgroud) 我正在分析用C编写的一些数字代码(profiler是Instruments,编译器clang在Mac OSX 10.11.6上).多达77.3%的运行时间用于_platform_memmove$VARIANT$Haswell.
在汇编输出中,上面的函数被调用DYLD-STUB$$memcpy.但是,memcpy我的C代码中没有(我确实有一些代码malloc).
更进一步,似乎汇编命令rep负责占用这么多时间.从这篇文章来看,似乎rep没有做任何有用的事情.为什么编译器会插入它?这memcpy是从哪里来的?
我也试过编译-g,但是_platform_memmove$VARIANT$Haswell几乎所有的时间都没有吞噬.
我知道在处理值时从non-constto 的隐式转换const并不危险,例如:
int mutable = 5;
const int immutable = mutable;
Run Code Online (Sandbox Code Playgroud)
但是,在使用指针时,我可以执行以下操作:
int some_number = 5;
int *mutable = &some_number;
const int *immutable = mutable; // <= Legal, but isn't it dangerous?
// Let's try to break const
printf("%d\n", *immutable); // Prints 5
mutable[0] = 10;
printf("%d\n", *immutable); // Prints 10
Run Code Online (Sandbox Code Playgroud)
顺便说一句,对于双指针,这是不允许的(至少您会收到警告)!请参阅此问题及其中的参考资料。
我有这段代码来制作几个字符串小写(请参阅此SO帖子).
void some_free_standing_function(std::string solver, std::map<std::string, option_t> opts) {
for (auto & c : solver) c = tolower(c);
for (auto p : opts)
for (auto & c : p.first)
c = tolower(c);
}
Run Code Online (Sandbox Code Playgroud)
第一个基于范围的for似乎是编译,最后一个不是:Clang给了我error: cannot assign to variable 'c' with const-qualified type 'const char &'.
为什么第一个通过但不通过第二个,因为它们完全相同?
我有一些来自C库的以下形式的免费函数对:
void dvecse(int, double, double *, int);
void svecse(int, float, float *, int);
Run Code Online (Sandbox Code Playgroud)
我想将它们包装在C ++中,这样我可以调用一个函数,例如vecse,然后让编译器找出要调用的两个函数。
我试图通过实现它std::enable_if,但是我不认为这是为了实现(打开/关闭语义而不是选择),并且由于重新声明,以下类似内容显然无法编译:
template <typename T>
std::enable_if<std::is_same<T, double>::value> vecse = dvecse;
template <typename T>
std::enable_if<std::is_same<T, float>::value> vecse = svecse;
Run Code Online (Sandbox Code Playgroud)
此外,我尝试std::conditional了似乎仅适用于类型而不适用于自由函数的方法(带有函子的设计将是一种替代方案,但我会将所有自由函数包装在函数对象中)。
在编译时实现功能选择的简洁方法是什么?