小编Nib*_*bor的帖子

为什么“重载解决方案”偏向于不受约束的模板功能而不是更具体的模板功能?

我有一个带有乘法的最小表达模板库,即

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 AB,其中后者是前者的子类:

template <typename T>
struct A { …
Run Code Online (Sandbox Code Playgroud)

c++ generic-programming sfinae expression-templates

14
推荐指数
1
解决办法
183
查看次数

柯南和康达包经理之间的差异

对于C/C++包装,有什么实际差异,即从开发商的角度来看,在柯南康达之间?

package-managers conda conan

12
推荐指数
0
解决办法
728
查看次数

x86-64汇编:为什么偏移25个字节?

我今天通过分析对应于这个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++ assembly

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

C程序在_platform_memmove $ VARIANT $ Haswell中占77%的时间

我正在分析用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几乎所有的时间都没有吞噬.

c macos profiling

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

为什么首先允许指针从非常量到常量的隐式转换?

我知道在处理值时从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)

顺便说一句,对于双指针,这是不允许的(至少您会收到警告)!请参阅问题及其中的参考资料。

c pointers const-correctness

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

循环两次相同:一个编译,另一个不编译

我有这段代码来制作几个字符串小写(请参阅此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++ string dictionary c++11

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

如何使用std :: conditional选择自由函数

我有一些来自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了似乎仅适用于类型而不适用于自由函数的方法(带有函子的设计将是一种替代方案,但我会将所有自由函数包装在函数对象中)。

在编译时实现功能选择的简洁方法是什么?

c++ templates generic-programming

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