小编Jiw*_*wan的帖子

对未对齐的内存进行reinterpret_cast

假设以下代码:

struct A
{
    int a;
    int b;
};

char* buffer = receivedFromSomeWhere();

A a = *reinterpret_cast<A*>(buffer + 1);
Run Code Online (Sandbox Code Playgroud)

如果buffer + 0在a的大小上对齐int,buffer + 1则很可能在未对齐的内存上.默认的复制构造函数可能会很高兴地复制两个未对齐的int成员ab.在x86/x64架构上,除了减慢代码之外,它会a以任何令人讨厌的方式影响复制构造吗?

我知道一个好的序列化将解决未对齐的内存问题(通过在某处添加填充以便A结构将在其中对齐buffer),但在我的情况下,我不负责这部分.

c++

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

lambdas中的std :: unique_ptr捕获

在使用C++ 11Boost.Asio的应用程序中,我开始使用lambda函数和一个std::unique_ptr.我想将此unique_ptr的所有权转移到lambda.您无法通过值捕获unique_ptr,因为此类不提供复制构造函数.通过引用捕获它也是愚蠢的,因为我确实希望转让所有权.

我决定用它std::bind来传递unique_ptr这个lambda函数的最后一个参数.我std::move用来给这个lambda提供一个r值引用.稍后我会将这个r值移动到std::unique_ptr(lambda的本地).我遇到了一些可怕的gcc错误,并且想知道我在代码中错过了什么.

这是包含我丑陋的非工作技巧的代码:

void NetworkClient::start()
{
    // Avoid the naggle algorithm on packets.
    ip::tcp::no_delay optionNoDelay(true);
    socket_.set_option(optionNoDelay);

    // Lambda function that receive a packet header.
    std::function<void (const boost::system::error_code& error, std::size_t bytesTransfered)> receiveHeaderHandler =
    [this, &receiveHeaderHandler] (const boost::system::error_code& error, std::size_t bytesTransfered)
    {
        if (error)
        {
            std::cout << LogType::ERROR << "Error while receiving a packet header" << std::endl;
        }

        if (bytesTransfered < 6)
        {
            std::cout << LogType::ERROR << …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

5
推荐指数
0
解决办法
1250
查看次数

ostream deferencing operator <<

为什么这样做很好:

cout << "foo";
Run Code Online (Sandbox Code Playgroud)

虽然这不?

(&cout)->operator<<("foo");
Run Code Online (Sandbox Code Playgroud)

它可以正常使用数值,所以我猜它是与覆盖相关的东西.(我正在使用MS Visual C++编译器.)

c++ cout operators

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

标签 统计

c++ ×3

c++11 ×1

cout ×1

operators ×1