小编Fir*_*his的帖子

提升状态图与Meta状态机

显然,boost包含两个独立的状态机库:StatechartMeta State Machine(MSM).标语给出了非常相似的描述:

  • Boost.Statechart - 任意复杂的有限状态机可以用易于阅读和维护的C++代码实现.
  • 元状态机 - 用于富有表现力的UML2有限状态机的高性能库.

你知道两者之间的主要区别和选择考虑因素是什么?

c++ boost state-machine boost-statechart boost-msm

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

C++中是否存在二进制内存流

我通常stringstream用来写入内存中的字符串.有没有办法在二进制模式下写入char缓冲区?请考虑以下代码:

stringstream s;
s << 1 << 2 << 3;
const char* ch = s.str().c_str();
Run Code Online (Sandbox Code Playgroud)

内存ch将如下所示:0x313233 - 字符1,2和3的ASCII代码.我正在寻找一种自己编写二进制值的方法.也就是说,我想在内存中使用0x010203.问题是我希望能够编写一个函数

void f(ostream& os)
{
    os << 1 << 2 << 3;
}
Run Code Online (Sandbox Code Playgroud)

并决定使用什么样的流.像这样的东西:

mycharstream c;
c << 1 << 2 << 3; // c.data == 0x313233;
mybinstream b;
b << 1 << 2 << 3; // b.data == 0x010203;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c++ iostream

53
推荐指数
3
解决办法
5万
查看次数

在常量表达式中使用numeric_limits :: max()

我想在类中定义一个常量,该值是最大可能的int.像这样的东西:

class A
{
    ...
    static const int ERROR_VALUE = std::numeric_limits<int>::max();
    ...
}
Run Code Online (Sandbox Code Playgroud)

此声明无法使用以下消息进行编译:

numeric.cpp:8:错误:"的std :: numeric_limits :: MAX()"不能出现在一个常数表达式numeric.cpp:8:错误:一个函数调用不能出现在一个常数表达式

我理解为什么这不起作用,但有两件事对我来说很奇怪:

  1. 在我看来,在常量表达式中使用该值是一个自然的决定.为什么语言设计者决定使max()成为一个函数,从而不允许这种用法?

  2. 该规范在18.2.1中声称

    对于在numeric_limits模板中声明为static const的所有成员,特化应以这样的方式定义这些值,使它们可用作整型常量表达式.

    这不是说我应该能够在我的场景中使用它而不是它与错误信息相矛盾吗?

谢谢.

c++ std numeric-limits constexpr

29
推荐指数
3
解决办法
9482
查看次数

std :: string :: assign是否取得字符串的"所有权"?

我对string::assign方法的理解存在一些差距.请考虑以下代码:

char* c = new char[38];
strcpy(c, "All your base are belong to us!");
std::string s;
s.assign(c, 38);
Run Code Online (Sandbox Code Playgroud)

是否s.assign分配新缓冲区并将字符串复制到其中,或者它是否拥有指针的所有权; 即不分配新内存并直接使用我的地址.如果它复制,那么assign和之间的区别是operator=什么?如果它没有复制,那么它是否释放内存或者我的责任?

谢谢.

c++ string

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

线程ID与线程句柄

一个令人尴尬的问题:线程ID和线程句柄之间有什么区别?为什么两者都需要?Windows和Linux之间有区别吗?

linux windows multithreading operating-system

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

如何使故意划分为零?

出于测试原因,我想在我的C++代码中将除以零.我写了这段代码:

int x = 9;
cout << "int x=" << x;
int y = 10/(x-9);
y += 10;
Run Code Online (Sandbox Code Playgroud)

我看到屏幕上印有"int = 9",但应用程序没有崩溃.是因为一些编译器优化(我用gcc编译)?可能是什么原因?

c++ divide-by-zero

11
推荐指数
2
解决办法
1552
查看次数

为AOSP 6定制Android模拟器(ranchu)

我需要构建一个Android模拟器的自定义版本,并开始重建模拟器而不对AOSP 6.0.1 R62进行任何更改.

令我惊讶的是,仿真器源代码不再包含在AOSP中.仿真器似乎预先构建在AOSP存储库中.经过一些研究,我设法建立了qemu(ranchu)本身:

  1. 我下载了qemu来源:

    git clone -b qemu-android-2.2.0 \
    https://android.googlesource.com/platform/external/qemu-android
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我下载了位于不同存储库中的qemu的Android构建脚本:

    git clone https://qemu-android.googlesource.com/qemu-ranchu
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我跑了 qemu-ranchu/scripts/rebuild.sh

该脚本构建QEMU和生成的二进制qemu-system-aarch64qemu-ranchu/binaries/linux-x86_64/.在AOSP中,有一个具有相同名称$aosp/prebuilts/android-emulator/linux-x86_64/qemu/linux-x86_64/的文件,但这不是最终用户将执行的文件.一个Android开发人员会运行一个名为emulatorin 的可执行文件$aosp/prebuilts/android-emulator/linux-x86_64/,它显然是某种基于qemu二进制文件的包装器.

所以实际的问题是:

  1. 是否有关于ranchu构建的文档及其涉及的所有内容?我找不到任何:(
  2. 不要将emulator*可执行文件里面包含他们QEMU还是他们执行外部QEMU的二进制?
  3. 如果我aosp/prebuilts/android-emulator/linux-x86_64/qemu/linux-x86_64/用我的自定义二进制文件覆盖qemu二进制文件,运行emulator实际上是否会调用我的自定义qemu?
  4. 我可以绕过emulatorqemu-system-aarch64直接运行我的AOSP映像吗?或者尝试配置它是疯了吗?
  5. 所有emulator*二进制文件的来源在哪里?

qemu android-emulator android-source

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

在"删除此"之后访问本地变量

我有一个使用引用计数机制的类.delete this当引用计数降为零时,最终通过调用来销毁此类的对象.我的问题是:我之后可以使用本地堆栈变量delete this吗?这是一个更具体的例子:

class RefCountedClass
{
public:
    RefCountedClass(Mutex& m) :
        mutex_(m)
    {}

    .
    .
    .

private:
    Mutex& mutex_;

    void RemoveReference()
    {
        // As I understand, mutex_ will be destroyed after delete,
        // but using m is all right because it is on-stack and
        // references an external object. Am I right?
        Mutex& m = mutex_; 
        m.Acquire();

        --recount_;
        if (refcount <= 0) delete this;

        m.Release();
    }
};
Run Code Online (Sandbox Code Playgroud)

c++

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

没有vtable的C++动态调度

据我所知,C++标准不要求使用虚方法表(aka vtable)实现动态调度.尽管如此,我还是觉得vtable是事实上的标准实现.我想知道是否有使用不同机制或至少允许不同机制的C++编译器.

c++ compiler-construction standards compilation

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

FastAPI 中间件查看响应

我尝试为 FastAPI 编写一个简单的中间件来查看响应主体。

在这个例子中,我只记录正文内容:

app = FastAPI()

@app.middleware("http")
async def log_request(request, call_next):
    logger.info(f'{request.method} {request.url}')
    response = await call_next(request)
    logger.info(f'Status code: {response.status_code}')
    async for line in response.body_iterator:
        logger.info(f'    {line}')
    return response
Run Code Online (Sandbox Code Playgroud)

但是看起来我以这种方式“消耗”了身体,导致了这个异常:

  ...
  File ".../python3.7/site-packages/starlette/middleware/base.py", line 26, in __call__
    await response(scope, receive, send)
  File ".../python3.7/site-packages/starlette/responses.py", line 201, in __call__
    await send({"type": "http.response.body", "body": b"", "more_body": False})
  File ".../python3.7/site-packages/starlette/middleware/errors.py", line 156, in _send
    await send(message)
  File ".../python3.7/site-packages/uvicorn/protocols/http/httptools_impl.py", line 515, in send
    raise RuntimeError("Response content shorter than Content-Length")
RuntimeError: Response content shorter than …
Run Code Online (Sandbox Code Playgroud)

python starlette fastapi

6
推荐指数
3
解决办法
6598
查看次数