我想知道一些我还没有找到令人信服的答案的东西.
情况:
std :: string和std :: vector都支持移动语义,这很可能意味着它们与非C++ 11变体不是二进制兼容的.但是应用程序和库都使用相同的编译器和标准库构建,因此如果lib能够识别并支持它,那就不会那么奇怪了.
上述情况是否安全,或者是否真的需要使用C++ 11标志编译所有内容,即使使用相同的构建环境?
这对我来说似乎很明显,但我找不到任何解决方案。假设我想添加或更改适用于所有 yocto 配方的编译器标志/选项。可以在某处添加全局标志而不更改配方?
看起来很简单,但我在语法上有一些困难 std::enable_if
情况其实很简单。
带有模板参数的模板类 T
2 不得为一种特定类型的T.
这两个函数都没有参数或返回值 T
一个函数接受一个int,另一个函数返回一个int。
有什么简单的例子吗?
还是有另一个不使用的选项(C++11)std::enable_if?
有很多与内存障碍相关的信息.大多数信息指的是多核或多处理器架构.Stackoverflow上的某处也指出单核处理器不需要内存屏障.
到目前为止,我找不到任何明确的解释为什么不应该在单核CPU上使用它.假设在线程A中重新排序了加载和存储,并且在两个指令之间发生了上下文切换.在这种情况下,线程B可能没有按预期做出反应.与不同内核上的2个线程相比,为什么单个内核上的上下文切换行为会有所不同?(除了任何缓存一致性问题)
例如,ARM网站上的一些信息:
"在架构上定义软件必须执行数据存储器屏障(DMB)操作:•在获取资源之间,例如,通过锁定互斥锁(MUTual EXclusion)或递减信号量,以及在制作之前对该资源进行任何访问可用的资源,例如,通过解锁互斥锁或增加信号量"
这听起来非常清楚,但是在提供的示例中,它们明确地提到了多核配置.
大多数关于内存顺序的信息是指多核/多CPU。最近我问了一个关于重新排序的问题,答案是主要发生在多核上。在单核 CPU 上运行一个小测试后:
thread1()
{
x++;
y++;
}
thread2()
{
if (x < y)
.... should not happen, because x is incremented first.
}
Run Code Online (Sandbox Code Playgroud)
x < y 在多核弱有序 CPU 上发生得更频繁,但在单核 CPU 上仍会发生。(这是我预料到的,但在大多数文章中都没有提到)
任何经验,确认或解释为什么它不应该发生在单个内核上(尽管它似乎在没有任何编译器优化的情况下发生)?
我见过很多类似的问题和答案,但到目前为止,让它发挥作用似乎并不那么明显。我对 CMake 还很陌生,到目前为止,除了与协议缓冲区的集成之外,一切都很简单。
我有一个带有子目录的项目,其中每个子目录都有自己的 CMakeLists.txt
其中一个子目录包含一个 .proto 文件。如果执行 PROTOBUF_GENERATE_CPP 宏,它将生成源文件和头文件。该宏是从包含 .proto 文件的子目录中的 CMakeLists.txt 调用的。
然而,似乎没有调用 make 文件,因为没有将源添加到目标。我无法将源添加到目标,因为文件不存在,它们在生成后存在,因此这会在 CMake 运行时导致错误。
将文件属性设置为生成似乎也没有帮助。一般来说,在构建过程开始之前,应该运行宏来生成源文件。
如何做到这一点,有工作示例吗?
例子:
./src/externals/protodef (来自其他存储库,仅包含 .proto 文件)
./src/ generated (假定为 protoc 生成的 c 和头文件)
CMakeLists-1(项目根目录)
cmake_minimum_required (VERSION 2.6)
PROJECT (prototest)
ADD_SUBDIRECTORY("${PROJECT_SOURCE_DIR}/src/externals/protodef")
ADD_SUBDIRECTORY("${PROJECT_SOURCE_DIR}/src")
SET_SOURCE_FILES_PROPERTIES(${PROTO_SOURCES} ${PROTO_HEADERS} PROPERTIES GENERATED TRUE)
ADD_EXECUTABLE(prototest ${PROTO_SOURCES} ${SOURCE} )
TARGET_LINK_LIBRARIES(prototest ${EXTERNAL_LIBS} )
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Run Code Online (Sandbox Code Playgroud)
CMakeLists-2(源代码)
SET(SOURCE ${SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
PARENT_SCOPE
)
Run Code Online (Sandbox Code Playgroud)
CMakeLists-3 (src/externals/protodef)
SET(PROTOBUF_PATH "D:/protobuf-3.0.0/" )
SET(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "${PROTOBUF_PATH}")
# Changing PROTO_SRCS and PROTO_HDRS does not work for setting …Run Code Online (Sandbox Code Playgroud) std::thread到目前为止,我开始使用 C++11 (mingw 4.8)很好。我遇到了 I/O 重叠的情况,sleepEx用于将线程置于可警告的等待状态。这工作得很好,直到QueueUserAPC必须使用,返回“无效句柄错误”。
经过一番搜索发现,std::thread在Windows下使用了pthread库。
有什么方法可以使用 Windows API 调用,它需要一个线程句柄std::thread吗?或者我是否需要坚持使用 Windows 线程来实现重叠 I/O?
Beast websocket示例将数据存储在多缓冲区中:
该实现使用一个或多个不同大小的字符数组的序列.附加的字符数组对象附加到序列以适应字符序列大小的变化.
在查看界面时,我并不完全清楚它是如何工作的.如果我读了描述,它可以看作是一个缓冲区数组.但似乎输出只是一大块数据.这是否意味着"一个或多个阵列"仅适用于内部结构?
在示例代码中,数据被读入缓冲区,如下所示: m_websocketStream.async_read(m_buffer.....
每个async_read操作都会创建一个新的内部缓冲区.
如果是这种情况,如何在另一端解释它.EG如何将其读入std :: string或std :: vector.
在查看sources时,data()返回const_buffer_type,这是一个前向声明.
对于数据成员,帮助信息提供以下信息,这些信息没有多大帮助:
用于将输入序列表示为缓冲区列表的类型.使用const_buffers_type = implementation_defined;
该定义似乎来自头文件boost/asio/buffer.hpp,它也包括在内.然而整体结构对我来说有些模糊.
我只是想了解如何将数据作为字节处理或将其转换为std :: string.
试过以下内容,但这也是不允许的:
std::string( boost::asio::buffer_cast<const char*>(m_buffer.data())
,boost::asio::buffer_size(m_buffer.data()) );
有人能开导我一点吗?