小编Wal*_*orf的帖子

C++ 11与现有库/框架的兼容性

我想知道一些我还没有找到令人信服的答案的东西.

情况:

  • 在没有启用c ++ 11的情况下编译的具有一些库(例如gtkmm)的系统.
  • 启用了C++ 11编译的应用程序.
  • 两者都编译并链接到相同的GCC版本/环境.
  • 应用程序对库使用std :: string和std :: vector进行了一些函数调用.

std :: string和std :: vector都支持移动语义,这很可能意味着它们与非C++ 11变体不是二进制兼容的.但是应用程序和库都使用相同的编译器和标准库构建,因此如果lib能够识别并支持它,那就不会那么奇怪了.

上述情况是否安全,或者是否真的需要使用C++ 11标志编译所有内容,即使使用相同的构建环境?

c++ shared-libraries c++11

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

如何将全局 CXX 编译器标志添加到 yocto 构建

这对我来说似乎很明显,但我找不到任何解决方案。假设我想添加或更改适用于所有 yocto 配方的编译器标志/选项。可以在某处添加全局标志而不更改配方?

compiler-flags yocto

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

如何禁用某些模板类型的类成员函数

看起来很简单,但我在语法上有一些困难 std::enable_if

情况其实很简单。

带有模板参数的模板类 T

2 不得为一种特定类型的T.

这两个函数都没有参数或返回值 T

一个函数接受一个int,另一个函数返回一个int

有什么简单的例子吗?

还是有另一个不使用的选项(C++11)std::enable_if

c++ templates sfinae enable-if c++11

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

单核ARM上的内存障碍

有很多与内存障碍相关的信息.大多数信息指的是多核或多处理器架构.Stackoverflow上的某处也指出单核处理器不需要内存屏障.

到目前为止,我找不到任何明确的解释为什么不应该在单核CPU上使用它.假设在线程A中重新排序了加载和存储,并且在两个指令之间发生了上下文切换.在这种情况下,线程B可能没有按预期做出反应.与不同内核上的2个线程相比,为什么单个内核上的上下文切换行为会有所不同?(除了任何缓存一致性问题)

例如,ARM网站上的一些信息:

"在架构上定义软件必须执行数据存储器屏障(DMB)操作:•在获取资源之间,例如,通过锁定互斥锁(MUTual EXclusion)或递减信号量,以及在制作之前对该资源进行任何访问可用的资源,例如,通过解锁互斥锁或增加信号量"

这听起来非常清楚,但是在提供的示例中,它们明确地提到了多核配置.

arm memory-barriers

5
推荐指数
1
解决办法
2163
查看次数

单核内存重新排序

大多数关于内存顺序的信息是指多核/多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 上仍会发生。(这是我预料到的,但在大多数文章中都没有提到)

任何经验,确认或解释为什么它不应该发生在单个内核上(尽管它似乎在没有任何编译器优化的情况下发生)?

memory multithreading multicore

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

CMake 与子目录中的 protobuf 文件

我见过很多类似的问题和答案,但到目前为止,让它发挥作用似乎并不那么明显。我对 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)

c++ cmake protocol-buffers

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

mingw std::thread 与 Windows API

std::thread到目前为止,我开始使用 C++11 (mingw 4.8)很好。我遇到了 I/O 重叠的情况,sleepEx用于将线程置于可警告的等待状态。这工作得很好,直到QueueUserAPC必须使用,返回“无效句柄错误”。

经过一番搜索发现,std::thread在Windows下使用了pthread库。

有什么方法可以使用 Windows API 调用,它需要一个线程句柄std::thread吗?或者我是否需要坚持使用 Windows 线程来实现重叠 I/O?

windows mingw c++11 stdthread

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

试图理解boost :: beast multibuffer

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()) );

有人能开导我一点吗?

beast websocket

3
推荐指数
2
解决办法
2257
查看次数