假设以下代码:
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成员a和b.在x86/x64架构上,除了减慢代码之外,它会a以任何令人讨厌的方式影响复制构造吗?
我知道一个好的序列化将解决未对齐的内存问题(通过在某处添加填充以便A结构将在其中对齐buffer),但在我的情况下,我不负责这部分.
在使用C++ 11和Boost.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) 为什么这样做很好:
cout << "foo";
Run Code Online (Sandbox Code Playgroud)
虽然这不?
(&cout)->operator<<("foo");
Run Code Online (Sandbox Code Playgroud)
它可以正常使用数值,所以我猜它是与覆盖相关的东西.(我正在使用MS Visual C++编译器.)