我需要在命令行上使用哪些标志来禁用g ++编译器自动启用的返回值优化?
c++ compiler-construction optimization g++ return-value-optimization
我想知道C++运行时系统如何检测对象何时超出范围,以便它相应地调用析构函数以释放占用的内存.
谢谢.
在C++中将向量声明为全局是一种好习惯吗?
这就是我做的.
#include <vector>
std::vector<int> vec;
Run Code Online (Sandbox Code Playgroud)
我的程序编译成功,但我不确定这是否会在某些情况下导致运行时错误.根据我的理解,全局变量的内存将在编译时分配,编译器可以保留此向量可以扩展的有限数量的内存.达到此限制后,正在写入的内容可能会吞噬另一个变量使用的内存.
请指教.
我时不时地遇到这个词.现在我真的需要一个明确的解释,因为我希望使用一些被认为不是中断安全的MPI例程.
这两种方法有什么区别?
有时当我遇到编译时错误抱怨编译器无法识别函数签名中的某些类类型时,如果我在相应变量前面添加关键字"class",它总能解决这种编译时错误.
例如,如果编译器无法识别Client中的类型
void recv( Client * c )
Run Code Online (Sandbox Code Playgroud)
然后,如果我改变它
void recv( class Client * c )
Run Code Online (Sandbox Code Playgroud)
问题已经解决了.
对不起,我无法想出一个具体的例子,因为我随机提出了这个问题.
为什么从类A的构造函数抛出的以下异常会被捕获两次,首先是构造函数本身内的catch,第二次是main函数中的catch?
为什么它不会被构造函数中的catch捕获一次?
#include <iostream>
using namespace std;
class E {
public:
const char* error;
E(const char* arg) : error(arg) { }
};
class A {
public:
int i;
A() try : i(0) {
throw E("Exception thrown in A()");
}
catch (E& e) {
cout << e.error << endl;
}
};
int main() {
try {
A x;
}
catch(...)
{
cout << "Exception caught" << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除main函数中的try-catch块,程序将崩溃.这是输出:
Exception thrown in A()
terminate called after throwing an instance of …Run Code Online (Sandbox Code Playgroud) 我想知道这个功能实际上是什么.根据我的理解,它应该返回pSrc [1].
那么为什么它会将左移pSrc [0]加扰8位,这会将这8位清零.当这些零与pSrc [1]进行"或"运算时,pSrc [1]不受影响,因此无论如何都会得到pSrc [1],就像从未发生过按位OR一样.
/*
* Get 2 big-endian bytes.
*/
INLINE u2 get2BE(unsigned char const* pSrc)
{
return (pSrc[0] << 8) | pSrc[1];
}
Run Code Online (Sandbox Code Playgroud)
此功能来自dalvik虚拟机的源代码. https://android.googlesource.com/platform/dalvik/+/android-4.4.4_r1/vm/Bits.h
更新:
好的,现在我得到了它,感谢这里的所有答案.
(1)pSrc [0]最初是无符号字符(1字节).
(2)当使用int类型的文字8左移(pSrc [0] << 8)时,pSrc [0]因此被int提升为signed int(4字节).
(3)pSrc [0] << 8的结果是pSrc [0]中感兴趣的8位被移位到signed int的4个字节的第二个字节,从而在其他字节中留下零(1st,第3和第4个字节).
(4)当ORed(步骤(3)的中间结果| pSrc [1])时,pSrc [1]然后被int提升为signed int(4字节).
(5)(步骤(3)| pSrc [1]的中间结果)的结果以两个最高有效字节中的所有零的形式留下前两个最低有效字节.
(6)通过将结果作为u2类型返回,仅返回前两个最低有效字节以获得2个大端字节.
我想将MyNamespace ::附加到宏定义的函数:
#define transFunc(func) \
dimensionedScalar func(const dimensionedScalar& ds) \
{ \
if (!ds.dimensions().dimensionless()) \
{ \
FatalErrorIn(#func "(const dimensionedScalar& ds)") \
<< "ds not dimensionless" \
<< abort(FatalError); \
} \
\
return dimensionedScalar \
( \
#func "(" + ds.name() + ')', \
dimless, \
MyNameSpace::##func(ds.value()) \
);
\
Run Code Online (Sandbox Code Playgroud)
}
但是当我打电话时
transFunc(Foo)
Run Code Online (Sandbox Code Playgroud)
编译器抛出以下错误:
粘贴"::"和"Foo"不会提供有效的预处理令牌
我上面连接令牌的方式有什么问题?
可能重复:
std :: vector元素是否保证是连续的?
我遇到过一种技术,人们在C++中使用向量来接收或发送MPI操作的数据,因为它据说将元素连续存储在内存中.
但是,我仍然怀疑这种方法对于任何大小的向量是否都会保持稳健,特别是当向量增长到一定大小时,这种假设可能会崩溃.
以下是我所说的一个例子:
MPI_Recv( &partials[0] , partials.size() , mpi_partial , 0,
DALG_ELIMINATE_REQ_MSG ,MPI_COMM_WORLD , &status );
Run Code Online (Sandbox Code Playgroud) c++ ×8
mpi ×2
vector ×2
bit-shift ×1
c ×1
class ×1
constructor ×1
contiguous ×1
destructor ×1
exception ×1
g++ ×1
heap ×1
interrupt ×1
keyword ×1
macros ×1
openmpi ×1
optimization ×1
runtime ×1
syntax-error ×1
try-catch ×1