如果我没有声明函数f为内联.如下:
啊:
X f(Y y);
Run Code Online (Sandbox Code Playgroud)
A.cpp:
X f(Y y)
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个翻译单元:
B.cpp:
#include "A.h"
Z g(W w)
{
...
... f(...) ...
...
}
Run Code Online (Sandbox Code Playgroud)
然后我用gcc 4.6编译两个翻译单元Ao和Bo,然后通过gcc链接它们.(也许两步都是-O3)
gcc会考虑在链接时内联函数来实现性能吗?或者为时已晚?
在代码审查中有人建议我不应该将我的函数声明为内联函数,因为编译器比内联时更了解.除非函数在头文件中定义,否则我总是会留下印象,因为编译器没有内联选项.
(如果C模式,C++模式或gnu ++ 0x模式的答案不同,请同时指出这一点)
情景A:
要在同一主机上运行的两个进程之间共享读/写内存块,Joe会从两个进程中映射相同的本地文件.
情景B:
为了在两个不同主机上运行的两个进程之间共享读/写内存块,Joe在主机之间通过nfs共享文件,然后从两个进程mmaps共享文件.
有人试过Scenario B吗?场景B中出现的哪些额外问题不适用于场景A?
在C99规范中它说的是remquo:
remquo函数用于实现参数减少,这可以利用商的一些低阶位.注意,x的幅度可能相对于y太大,以至于商的精确表示是不实际的.
在这种情况下什么是"参数减少",什么是可以利用商的一些低阶位的例子?
考虑动态编程问题,该问题询问序列S有多少不同的子序列(不一定是连续的)具有值p0的特定属性P.
P的范围小且有限,并且有一种有效的计算P的方法:
P(s1 + s2) = f(P(s1), P(s2))
Run Code Online (Sandbox Code Playgroud)
其中+表示序列连接.
一种方法是计算S[1] + S[2] + ... + S[k]具有属性px的S 的前缀有多少个子序列.(存放在这里Count[px][k])
所以递归是:
Count[px][k] = Count[px][k-1] // not using element S[k];
P pq = f(px,P(S[k])); // calculate property pq of appending element S[k]
Count[pq][k] += Count[px][k-1] // add count of P(prefix+S[k])
Run Code Online (Sandbox Code Playgroud)
然后答案是:
return Count[p0][S.length]
Run Code Online (Sandbox Code Playgroud)
当S的元素成对不同时,这将起作用,但是它会计算两个具有相同值但使用不同位置的不同元素的子序列.
如何修改此算法,使其只计算一次相等的子序列?(即仅计算不同的子序列)
请考虑以下代码:
template<class T>
size_t f(T t, size_t& x) { return x++; }
template<class... Args>
void g(Args... args)
{
size_t x = 0;
size_t y[] = { f(args, x)... };
for (size_t i = 0; i < sizeof...(args); i++)
assert(y[i] == i);
}
Run Code Online (Sandbox Code Playgroud)
C++ 11标准保证的断言不会触发吗?为什么或者为什么不?
考虑以下:
struct B { };
template<typename T>
struct D : B
{
T t;
}
void g(int i) { ... }
void g(string s) { ... }
void g(char c) { ... }
void f(B* b)
{
if (dynamic_cast<D<int>*>(b))
{
g(dynamic_cast<D<int>*>(b)->t);
}
else if (dynamic_cast<D<string>*>(b))
{
g(dynamic_cast<D<string>*>(b)->t);
}
else if (dynamic_cast<D<char>*>(b))
{
g(dynamic_cast<D<char>*>(c)->t)
}
else
throw error;
};
Run Code Online (Sandbox Code Playgroud)
这里只有三种可能类型的T - int,string,char - 但如果可能类型的列表更长,比如说n,则if else链将执行O(n).
解决这个问题的一种方法是在D中以某种方式存储额外的类型代码,然后switch在类型代码上存储.
RTTI系统必须已经有这样的代码.有没有办法访问它并打开它?
或者有更好的方法来做我想做的事情吗?
不以encoding-prefix开头的字符串文字是普通的字符串文字,并使用给定的字符进行初始化.
以u8开头的字符串文字,例如u8"asdf",是一个UTF-8字符串文字,并使用UTF-8编码的给定字符进行初始化.
我不明白普通字符串文字和UTF-8字符串文字之间的区别.
有人可以提供一个他们不同的情况的例子吗?(导致不同的编译器输出)
(我的意思是从标准的POV,而不是任何特定的实现)
字符文字或字符串文字中的每个源字符集成员,以及字符文字或非原始字符串文字中的每个转义序列和通用字符名称,都将转换为执行字符集的相应成员.
在C++ 11中,当一个表单的预处理指令...
#if expr
Run Code Online (Sandbox Code Playgroud)
遇到......,如下所述expr进行评估.constant-expression16.1 [cpp.cond]
这是在宏替换之后完成的expr,其标识符(和关键字)被替换为0,它preprocessing-tokens被转换为tokens,defined运算符被评估,等等.
当令牌之一,我的问题是会发生什么expr是user-defined-literal?
用户定义的文字就像函数调用,但函数调用不能发生在expr(我认为)中,作为标识符替换的副作用.但技术上user-defined-literals可以存活下来.
我怀疑这是一个错误,但我不明白如何从标准中得出结论?
也许[cpp]忽略了在第16条中添加用户定义文字的(迂腐)影响?
或者我错过了什么?
更新:
通过一个例子澄清:
这预处理到什么:
#if 123_foo + 5.5 > 100
bar
#else
baz
#endif
Run Code Online (Sandbox Code Playgroud)
吧或巴兹还是错误的?
GCC 4.7报告:
test.cpp:1:5: error: user-defined literal in preprocessor expression
Run Code Online (Sandbox Code Playgroud)
所以它认为这是一个错误.这可以参考标准来证明吗?或者这只是"隐含的"?
可以使用非复合子语句编写C switch语句:
int x = 2;
int y = 3;
int main()
{
switch (x)
y++; // ok
switch (x)
case 2: y++; // ok
}
Run Code Online (Sandbox Code Playgroud)
这有什么用例吗?也就是说,是否有理由使用switch语句的非复合子语句?
我对 的语义感到困惑vkAcquireNextImageKHR。具体来说,函数在什么情况下可以返回VK_TIMEOUT?即什么可以阻止它无法立即获取图像?它可能会等待发生什么?
似乎即使呈现引擎尚未完成从图像的读取,也可以获取图像,并且无论如何都需要使用信号量或栅栏来同步所获取图像的使用。我缺少什么?