小编bin*_*y01的帖子

避免使用std :: function和member函数进行内存分配

此代码仅用于说明问题.

#include <functional>
struct MyCallBack {
    void Fire() {
    }
};

int main()
{
    MyCallBack cb;
    std::function<void(void)> func = std::bind(&MyCallBack::Fire, &cb);
}
Run Code Online (Sandbox Code Playgroud)

使用valgrind进行的实验表明,分配的行在funclinux上使用gcc 7.1.1动态分配大约24个字节.

在真正的代码中,我有一些不同的结构,所有结构都void(void)存储了大约1000万个成员函数 std::function<void(void)>.

在做std::function<void(void)> func = std::bind(&MyCallBack::Fire, &cb);什么时,有什么方法可以避免内存被动态分配?(或以其他方式将这些成员函数分配给a std::function)

c++ gcc

24
推荐指数
2
解决办法
6513
查看次数

sctp_connectx()在FreeBSD上给出了EINVAL

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/sctp.h>
#include <stdio.h>
#include <string.h>

int main(int argc,char **argv)
{

    struct sockaddr_in remoteAddr;

    int clientSock = socket(PF_INET,SOCK_SEQPACKET,IPPROTO_SCTP);
    if(clientSock == -1) {
        perror("socket");
        return 1;
    }
    memset(&remoteAddr,0,sizeof remoteAddr);
    remoteAddr.sin_family = AF_INET;
    remoteAddr.sin_len = sizeof remoteAddr;
    remoteAddr.sin_port = htons(5555);
    remoteAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    sctp_assoc_t assoc_id = 0;
    if(sctp_connectx(clientSock,(struct sockaddr*)&remoteAddr,1, &assoc_id)!= 0) {
        perror("sctp_connectx");
        return 1;
    }
    printf("Connected! Assoc ID %d\n",(int)assoc_id);

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

运行时,此代码失败:

$ clang  -Wall sctp_connect.c 
$ ./a.out 
sctp_connectx: Invalid argument
$ uname -rp …
Run Code Online (Sandbox Code Playgroud)

c freebsd sctp

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

如何在Eclipse中重置缩放?

在Eclipse中,可以使用CTRL+CTRL-缩放文本编辑器.

如何将缩放级别重置为默认值(100%)?

eclipse

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

使用t(*this)会导致RuntimeError,而t(std :: ref(*this)则不会

我有以下示例:

#include <iostream>
#include <functional>

struct Tmr {
    typedef std::function<void(void)> Callback;
    Callback cb;

    Tmr(Callback cb_) :
        cb( cb_ )
    {
    }

    void timeout()
    {
        cb();
    }
};

struct Obj {
    struct Tmr t;

    Obj() :
        t( std::ref( *this ) )
    {
    }

    void operator () ()
    {
        std::cout << __func__ << '\n';
    }
};

int main(int argc, char *argv[])
{
    Obj o;

    o.t.timeout();

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

运行正常,但最初我有以下构造函数Obj:

Obj() :
    t( *this )
Run Code Online (Sandbox Code Playgroud)

这导致运行时错误.我想这是因为只有对成员函数的引用存储在我的回调中,而不是调用成员的对象.

我不明白的是std::ref,当我这样做Obj() : …

c++

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

为什么没有调用std :: string移动构造函数?

我有这个例子:

#include <string>
#include <iostream>

class Test {
private:
    std::string str;
public:
    Test(std::string &&str_) :
        str(str_)
    {}

    const std::string &GetStr()
    {
        return str;
    }
};

int main(int argc, char *argv[])
{
    std::string there("1234567890");
    std::cout << "1. there: " << there << '\n';

    Test t1(std::move(there));

    std::cout << "2. there: " << there << '\n';
    std::cout << "3. there: " << t1.GetStr() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

它给出了输出

$ ./a.out
1. there: 1234567890
2. there: 1234567890
3. there: 1234567890
Run Code Online (Sandbox Code Playgroud)

这是在linux上使用gcc 5.1.1.虽然there字符串在移动后将保持有效但不确定的状态,但如果调用std :: …

c++

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

如何优雅地处理给予EMFILE并关闭连接的accept()?

当进程用完文件描述符时,accept()将失败并设置errno为EMFILE.但是,已接受的基础连接未关闭,因此似乎无法通知客户端应用程序代码无法处理连接.

问题是在用完文件描述符时接受TCP连接的正确行动是什么.

以下代码演示了我想学习如何最好地处理的问题(注意这只是用于演示问题/问题的示例代码,而不是生产代码)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


static void err(const char *str)
{
    perror(str);
    exit(1);
}


int main(int argc,char *argv[])
{
    int serversocket;
    struct sockaddr_in serv_addr;
    serversocket = socket(AF_INET,SOCK_STREAM,0);
    if(serversocket < 0)
        err("socket()");

    memset(&serv_addr,0,sizeof serv_addr);

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr= INADDR_ANY;
    serv_addr.sin_port = htons(6543);
    if(bind(serversocket,(struct sockaddr*)&serv_addr,sizeof serv_addr) < 0)
        err("bind()");

    if(listen(serversocket,10) < 0)
        err("listen()");

    for(;;) {
        struct sockaddr_storage client_addr;
        socklen_t client_len = sizeof client_addr;
        int clientfd;

        clientfd …
Run Code Online (Sandbox Code Playgroud)

c sockets

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

从C数组初始化std :: array的正确方法

我从C API获取一个数组,我想将它复制到std :: array以便在我的C++代码中进一步使用.那么这样做的正确方法是什么?

I 2用于此,一个是:

struct Foo f; //struct from C api that has a uint8_t kasme[32] (and other things)

c_api_function(&f);
std::array<uint8_t, 32> a;
memcpy((void*)a.data(), f.kasme, a.size());
Run Code Online (Sandbox Code Playgroud)

还有这个

class MyClass {
  std::array<uint8_t, 32> kasme;
  int type;
public:
  MyClass(int type_, uint8_t *kasme_) : type(type_)
  {
      memcpy((void*)kasme.data(), kasme_, kasme.size());
  }
  ...
}
...
MyClass k(kAlg1Type, f.kasme);
Run Code Online (Sandbox Code Playgroud)

但这感觉相当笨重.有没有惯用的方法,这可能不涉及memcpy?对于MyClass`或许我最好使用构造函数获取一个std :: array进入成员但我无法弄清楚这样做的正确方法.?

c++ arrays algorithm copy initialization

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

使用gold vs ld链接器时使用的glibc/pthreads中的不同符号

我有一个简单的测试程序调用pthread_cond_broadcast.

ld链接器链接时,显示:

情况1:

$ nm ld-test  | grep cond_broadcast
U pthread_cond_broadcast@@GLIBC_2.3.2
Run Code Online (Sandbox Code Playgroud)

gold链接器链接时,它显示:

案例2:

 $ nm gold-test  | grep cond_broadcast
 U pthread_cond_broadcast
Run Code Online (Sandbox Code Playgroud)

pthread/libc包含几个带有不同版本符号的pthread_cond_broadcast符号,可能是因为ABI已被更改.

$ nm  /lib64/libc.so.6  |grep cond_broadca
00000036b84f7d30 t __pthread_cond_broadcast
00000036b85278f0 t __pthread_cond_broadcast_2_0
00000036b84f7d30 T pthread_cond_broadcast@@GLIBC_2.3.2
00000036b85278f0 T pthread_cond_broadcast@GLIBC_2.2.5
$ nm  /lib64/libpthread.so.0  |grep cond_broadcast
00000036b880bee0 t __pthread_cond_broadcast
00000036b880c250 t __pthread_cond_broadcast_2_0
00000036b880bee0 T pthread_cond_broadcast@@GLIBC_2.3.2
00000036b880c250 T pthread_cond_broadcast@GLIBC_2.2.5
Run Code Online (Sandbox Code Playgroud)

所以问题是:

  1. 为什么gold和老/正常之间的行为不同ld.
  2. 当二进制文件链接到无版本pthread_cond_broadcast符号时,在案例2中正在运行时使用哪个pthread_cond_broadcast 符号.pthread_cond_broadcast的最新实现?最老的 ?

这是使用gcc 4.9.2和binutils 2.24中的gold/ld链接器(作为Red Hat 的devtoolset-3的一部分.)

c linux gcc glibc binutils

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

为什么存储返回值可以避免两次借用

use std::fs::File;
use std::io::prelude::*;
use std::io::BufReader;
fn main() {
    let f = File::open("test.txt").expect("Can't open");
    let mut b = BufReader::new(f);
    let v = b.fill_buf().unwrap();
    println!("v: {:?}", v);

    b.consume(v.len());
}
Run Code Online (Sandbox Code Playgroud)

无法编译,错误是

error[E0499]: cannot borrow `b` as mutable more than once at a time
  --> src/main.rs:10:5
   |
7  |     let v = b.fill_buf().unwrap();
   |             ------------ first mutable borrow occurs here
...
10 |     b.consume(v.len());
   |     ^^^^^^^^^^-------^
   |     |         |
   |     |         first borrow later used here
   |     second mutable borrow occurs here
Run Code Online (Sandbox Code Playgroud)

将最后一行更改为: …

rust

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

实现不消耗的迭代器

我有这个代码,用于学习目的:

struct Fibonacci {
    curr: u32,
    next: u32,
}

impl Iterator for Fibonacci {
    type Item = u32;

    fn next(&mut self) -> Option<Self::Item> {
        let current = self.curr;

        self.curr = self.next;
        self.next = current + self.next;
        Some(current)
    }
}

impl Fibonacci {
    fn new() -> Self {
        Fibonacci { curr: 0, next: 1 }
    }

    fn current(&self) -> u32 {
        self.curr
    }
}

fn main() {
    println!("The first four terms of the Fibonacci sequence are: ");
    let fib = Fibonacci::new(); …
Run Code Online (Sandbox Code Playgroud)

iterator rust

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

标签 统计

c++ ×4

c ×3

gcc ×2

rust ×2

algorithm ×1

arrays ×1

binutils ×1

copy ×1

eclipse ×1

freebsd ×1

glibc ×1

initialization ×1

iterator ×1

linux ×1

sctp ×1

sockets ×1