我有一个原型函数,void* myFcn(void* arg)用作pthread的起点.我需要将参数转换为int以供以后使用:
int x = (int)arg;
Run Code Online (Sandbox Code Playgroud)
编译器(GCC版本4.2.4)返回错误:
file.cpp:233: error: cast from 'void*' to 'int' loses precision
Run Code Online (Sandbox Code Playgroud)
投这个的正确方法是什么?
如果我有一个C++ 11程序运行两个线程,其中一个抛出一个未处理的异常,会发生什么?整个程序会死于火热的死亡吗?抛出异常的线程是否会单独死亡(如果是这样,我可以在这种情况下获得异常)吗?还有别的吗?
在设计要通过连接C和C++代码的C API传递的数据结构时,使用它是否安全bool?也就是说,如果我有struct这样的:
struct foo {
int bar;
bool baz;
};
Run Code Online (Sandbox Code Playgroud)
是否保证C的大小和含义baz以及它的位置foo由C(它是a _Bool)和C++ 以相同的方式解释?
我们正在考虑在一个平台上进行此操作(在Beaglebone上使用GCC for Debian 8),C和C++代码由相同的GCC版本(分别为C99和C++ 11)编译.不过,欢迎提出一般性意见.
常见情况:
一般来说,什么是好的做法.我总是感到困惑.首先,将所有内容作为引用传递似乎是一致的,但是不可能将Literals作为引用传递或将NULL作为引用传递.
类似地,将所有内容作为指针似乎都很好,但是我必须担心指针可能指向NULL并检查该函数开头的那些条件.
你认为以下片段是好的吗?
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <tr1/memory>
#include <algorithm>
using namespace std;
using namespace std::tr1;
int main(){
map<string, shared_ptr<vector<string> > > adjacencyMap;
vector<string>* myFriends = new vector<string>();
myFriends->push_back(string("a"));
myFriends->push_back(string("v"));
myFriends->push_back(string("g"));
adjacencyMap["s"] = shared_ptr<vector<string> >(myFriends);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢Ajay
std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;
Run Code Online (Sandbox Code Playgroud)
在这里似乎p1不再是"唯一的",因为p2也指它
这是合法的c ++?unique_ptr有copy_semantics吗?如果不是,并且它只有移动语义,那么在将p1分配给p2后p1是否设置为NULL?
编辑:
好的,所以正确的版本是
p2=std::move(p1)
Run Code Online (Sandbox Code Playgroud)
据此,在此分配后,p1无效?与auto_ptr的区别在哪里?所有权明确规定所有权转让比隐式更安全,因为我认为auto_ptr是这种情况
什么是C++中的SFINAE?
能不能用不熟悉C++的程序员理解的话来解释它?另外,像Python这样的语言中的SFINAE对应的概念是什么?
我们发现在代码中我们有几个位置,其中并发读取受互斥锁保护的数据是相当常见的,而写入很少见.我们的测量结果似乎表明,使用简单的互斥锁严重阻碍了读取数据的代码的性能.所以我们需要的是多读/单写互斥.我知道这可以建立在更简单的原语之上,但在我尝试自己之前,我宁愿要求现有的知识:
从简单的同步原语中构建多读/单写锁的批准方法是什么?
我确实知道如何制作它,但我宁愿通过我(可能是错误的)想出的答案而不偏不倚.(注意:我期望的是如何解释它,可能是伪代码,而不是完整的实现.我当然可以自己编写代码.)
注意事项:
这需要有合理的表现.(我想到的是每次访问需要两次锁定/解锁操作.现在可能不够好,但需要其中许多操作似乎是不合理的.)
通常,读取数量更多,但写入比读取更重要且性能更敏感.读者不能让作家们挨饿.
我们被困在一个相当古老的嵌入式平台(VxWorks 5.5的专有变体)上,有一个相当旧的编译器(GCC 4.1.2)和boost 1.52 - 除了大多数依赖于POSIX的boost部分,因为POSIX没有完全实现在那个平台上.可用的锁定原语基本上是几种信号量(二进制,计数等),我们已经在其上创建了互斥量,条件变量和监视器.
这是IA32,单核.
假设我有std::vector发言权Vector
现在在对向量(插入或删除)执行某些操作之后,我想检查向量是否为空,并且基于此我想要执行某些操作.
哪种方法更好
方法1
if (Vector.size() == 0){ /* operations */ }
Run Code Online (Sandbox Code Playgroud)
方法2
if (Vector.empty()) { /* operations */ }
Run Code Online (Sandbox Code Playgroud)
哪种方法更好,1还是2?
以下引用来自Addison Wesley的C++模板.有人可以帮助我用简单的英语/外行人的术语来理解它的要点吗?
因为字符串文字是具有内部链接的对象(两个字符串文字具有相同的值但在不同的模块中是不同的对象),所以您不能将它们用作模板参数:
C++ 2003 8.5/5说:
到缺省初始化类型的对象T表示:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化.
[重点补充.]
C++ 2011标准将最后一项更改为
- 否则,不执行初始化.
对于某些程序来说,这似乎是一个突破性的变化.这是故意的吗?
编辑
以下是一些激励这个问题的代码:
class Foo {
public:
Foo() : m_values() {}
int m_values[3];
};
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,我认为m_values在默认构造函数中明确提到将默认初始化该数组.由于数组的元素是标量,我预计这意味着值都被设置为0.
在C++ 11中,似乎不再保证会发生这种情况.但也许正如Mooing Duck在评论中指出的那样,也许这不再是默认初始化的情况,而是一些保留预期行为的其他形式.引文欢迎.