gpt4 book ai didi

c++ - 带有 lambda 表达式的 Boost::Signals2 插槽在 arm32 上使用 gcc6 失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:44 24 4
gpt4 key购买 nike

我从一位同事那里收到了以下代码,使用 Boost::Signal2 和 lambda 表达式分解到最低限度。它使用 g++ 6.x 和 g++ 5.4.1 编译(后者带有参数 -std=c++11)。

它应该打印i: 5(应该是5)

使用 gcc 6.4.1(或 6.1.1)的 arm32 交叉编译器(arm-cortexa15-linux-gnueabihf-g++)并在这样的系统上运行,输出是 i: 0(应该是 5 )

其他架构 (x86_64) 和编译器 (gcc 5.4.1) 按预期工作。

当我将代码更改为使用信号而不是插槽时,一切正常。

我的问题是:

  1. 这段代码真的应该可靠地输出 i: 5(应该是 5),还是这段代码有错误并且只是偶然工作?

  2. 或者 ARM32 gcc6 编译器中是否存在错误? (海湾合作委员会 5 作品)

代码:

#include <exception>
#include <iostream>
#include <boost/signals2.hpp>

class LogBuffer : public std::streambuf
{
public:
LogBuffer()
{
}

char m_buf[242 - 20];
};

namespace boost
{
void assertion_failed(char const * p_expr,
char const *,
char const *, long)
{
std::cerr << "FAILED: " << p_expr << std::endl;
}

void assertion_failed_msg(char const *,
char const * msg,
char const *,
char const *, long)
{
std::cerr << "FAILED: " << msg << std::endl;
}
} // namespace boost

void myfunction(void)
{

{
LogBuffer b;
std::cout << "LogBuffer size: " << sizeof(LogBuffer) << std::endl;
}
int i=5;
std::cout << i << std::endl;
auto lambda = [i] { std::cerr << "i: " << i << " (should be 5)" << std::endl; };
boost::signals2::signal<void()>::slot_type slot{lambda};
slot();
}

int main(int argc, char *argv[])
{
myfunction();
}

编译运行输出如下:

arm-cortexa15-linux-gnueabihf-g++ (GCC) 6.4.1 20170811
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Linux fctj-4a 4.4.109-g68c6f3c-fsm4_axm #1 SMP PREEMPT Fri Feb 2 05:37:09 UTC 2018 armv7l GNU/Linux

LogBuffer size: 256
5
i: 0 (should be 5)

最佳答案

这看起来像是一个错误。

你能减少复制器吗?说,

  • 如果禁用优化会怎样

  • 如果删除 LogBuffer 会怎样?

  • 如果移除插槽并将其用作信号会发生什么情况

  • 如果保留信号并直接调用 lambda 会怎样?

  • 如果在创建插槽之前调用 lambda 会发生什么情况

  • 如果您甚至不创建槽并直接调用 lambda 会怎样?

  • 如果您进一步删除 signals2 header 会发生什么。

  • 如果您在断言处理程序中终止会发生什么(也许您在 std::cout 尚未初始化//可用时获得断言)

    <

如果你将它缩减到最简单的核心,但仍然失败,你至少会知道是在 Boost 还是 GCC 提交错误

关于c++ - 带有 lambda 表达式的 Boost::Signals2 插槽在 arm32 上使用 gcc6 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48811101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com