小编Gil*_*esz的帖子

我不能将lambda作为std :: function传递

让我们关注这个例子:

template<typename T>
class C{
    public:
    void func(std::vector<T>& vec, std::function<T( const std::string)>& f){
        //Do Something
    }
};
Run Code Online (Sandbox Code Playgroud)

而现在,我正在努力:

std::vector<int> vec;
auto lambda = [](const std::string& s) { return std::stoi(s); };
C<int> c;
c.func(vec, lambda);
Run Code Online (Sandbox Code Playgroud)

它会导致错误:

no matching function for call to ‘C<int>::func(std::vector<int, std::allocator<int> >&, main()::<lambda(const string&)>&)’
     ref.parse(vec, lambda);
Run Code Online (Sandbox Code Playgroud)

请解释一下什么不好,以及如何使用std :: bind实现它.

c++ lambda c++11

44
推荐指数
2
解决办法
3万
查看次数

INC指令与ADD 1:重要吗?

来自Ira Baxter回答,为什么INC和DEC指令不会影响进位标志(CF)?

大多数情况下,我远离INCDEC现在,因为他们做的部分条件代码更新,这样就可以在管道中引起滑稽的摊位,和ADD/ SUB没有.因此,无关紧要(大多数地方),我使用ADD/ SUB避免失速.我使用INC/ DEC仅在保持代码较小的情况下,例如,适合高速缓存行,其中一个或两个指令的大小产生足够的差异.这可能是毫无意义的纳米[字面意思!] - 优化,但我在编码习惯上相当老派.

我想问一下为什么它会导致管道中的停顿,而添加不会?毕竟,无论是ADDINC更新标志寄存器.唯一的区别是INC不更新CF.但为什么重要呢?

performance x86 assembly increment micro-optimization

26
推荐指数
2
解决办法
4234
查看次数

x86上的原子性

8.1.2总线锁定

Intel 64和IA-32处理器提供LOCK#信号,该信号在某些关键存储器操作期间自动置位,以锁定系统总线或等效链路.当该输出信号被断言时,来自其他处理器或总线代理的用于控制总线的请求被阻止.软件可以指定在遵循LOCK语义的其他情况下将LOCK前缀添加到指令之前.

它来自英特尔手册,第3卷

听起来内存上的原子操作将直接在内存(RAM)上执行.我很困惑,因为当我分析装配输出时,我看到"没什么特别的".基本上,生成的汇编输出std::atomic<int> X; X.load()只会产生"额外"的影响.但是,它负责正确的内存排序,而不是原子性.如果我理解得X.store(2)恰到好处mov [somewhere], $2.就这样.它似乎没有"跳过"缓存.我知道将对齐(例如int)移动到内存是原子的.但是,我很困惑.


所以,我提出了疑问,但主要问题是:

CPU如何在内部实现原子操作?

c++ x86 multithreading atomic memory-barriers

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

Swig工具和C++.太聪明了

http://www.swig.org/papers/PyTutorial98/PyTutorial98.pdf 来自以上链接:

在此输入图像描述

我知道这是一个旧的出版物,因此信息可能已经过时.

我想问一下:

"如果你不太聪明,似乎可以正常使用C++"这是什么意思,太聪明了?

在编写C++模块和使用swig工具扩展Python的地方,我是否已经非常谨慎地知道情况/案例?

python swig

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

出版和阅读非易变性领域

public class Factory {
    private Singleton instance;
    public Singleton getInstance() {
        Singleton res = instance;
        if (res == null) {
            synchronized (this) {
                res = instance;
                if (res == null) {
                    res = new Singleton();
                    instance = res;
                }
            }
        }
        return res;
    }
}
Run Code Online (Sandbox Code Playgroud)

它几乎是正确的线程安全实现Singleton.我看到的唯一问题是:

thread #1被初始化的instance字段可以发布之前就被完全初始化.现在,第二个线程可以读取instance不一致的状态.

但是,就我而言,这只是问题所在.这只是问题吗?(而且我们可以变得instance不稳定).

java volatile

13
推荐指数
2
解决办法
334
查看次数

Sandybridge微体系结构中的堆栈引擎是什么?

我正在阅读http://www.realworldtech.com/sandy-bridge/,我在理解一些问题时面临一些问题:

专用堆栈指针跟踪器也存在于Sandy Bridge中并重命名堆栈指针,消除了串行依赖性并删除了多个uop.

什么是dedicated stack pointer tracker实际?

对于Sandy Bridge(和P4),英特尔仍然使用术语ROB.但重要的是要理解,在这种情况下,它只引用了飞行中uops的状态数组

事实上它意味着什么?请说清楚.

x86 assembly intel cpu-architecture

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

继承 BaseException 与 Exception

Exception我知道和BaseException之间有什么区别Python。我想知道什么是更好的做法并且更具Python风格:我的异常应该继承自BaseExceptionorException吗?

python-3.x

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

std :: bind和rvalue引用

让我们考虑以下代码:

class Widget{
};

int main(){
Widget w;
auto lambda = bind([](Widget&& ref){ return; }, std::move(w));

return 0;
}
Run Code Online (Sandbox Code Playgroud)

它会触发错误

no match for call to ‘(std::_Bind<main()::<lambda(Widget&&)>(Widget)>) ()’
     lambda();
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么错误出现了?毕竟,我对rvalue引用进行了显式转换 - 我的意思是std::move(w)我通过rvalue引用参数 - 我的意思是Widget&& ref.

这是怎么回事?

而且下面的代码有效,让我更担心的是:

class Widget{
};

int main(){
Widget w;
auto lambda = bind([](Widget& ref){ return; }, std::move(w));

return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference c++11

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

SystemTap似乎给出了无关的输出

我的系统是Ubuntu , uname -r = 4.15.0-23-generic. 我已经为内核安装了调试符号.

我的问题是:


我正在尝试socket(AF_PACKET, SOCK_DGRAM, 0)用于传输目的.对于sendto(fd, 0,0,0,0,0)系统调用我有EINVAL (无效参数),我试图调查原因是什么.


因此,要找出EINVAL我使用SystemTap 返回的内容.下面的脚本按tpacket_snd功能语句跟踪执行语句.

我的探测程序:info.stp

probe kernel.statement("tpacket_snd@*:*") {
    tokenize(pp(),"@");
    printf("HIT %s\n", tokenize("","@"))
}
Run Code Online (Sandbox Code Playgroud)

以下是sudo stap info.stp我实现这种传输的输出:

HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2619")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2627")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2628")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2636")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2638")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2640")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2641")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2656")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2659")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2658")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2662")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2663")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2669")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2671")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2674")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2672")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2675")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2680")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2688")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2692")
HIT …
Run Code Online (Sandbox Code Playgroud)

linux trace kernel systemtap

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

malloc 不保证返回物理上连续的内存

我正在阅读有关虚拟内存的内容,我的结论如下:

malloc(size);
Run Code Online (Sandbox Code Playgroud)
  1. malloc 不保证返回物理上连续的内存。它保证返回几乎连续的内存。特别是当大小 > 4KB 时更是如此,因为 4KB 是页面的大小。(在 Linux 系统上)。

我是对还是错?请解释。

malloc memory-management

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