在以下C++ 11代码中:
void f(int) {}
void f(double) {}
void (*p)(int) = f;
Run Code Online (Sandbox Code Playgroud)
有两个功能.
第三个f标识符是id-expression和初始化器p.
在5.1.1p8 [expr.prim.general]/8中它说:
[id-expression]的类型是标识符的类型.结果是由标识符表示的实体.如果实体是函数,变量或数据成员,则结果是左值,否则为prvalue.
鉴于这f可能是指具有两种不同类型的两个不同实体,则没有"实体"或"类型".
标准中是否还有其他一些文字可以解决这种情况?
实现只是将此歧义消除为扩展或是否需要在某处?(没有其他一些文本,人们可能会争辩说实现可能会拒绝f id-expression为含糊不清的.)
在gcc/g ++ 4.9下我可以写:
int x __attribute__((unused)) = f();
Run Code Online (Sandbox Code Playgroud)
表示x是故意未使用的.
是否有可能以[[]]某种方式使用C++ 11 属性表示法?
我试过了:
int x [[unused]] = f();
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
(是的,我知道它是一个实现定义的属性.)
应用程序图像的实现具有通过由编译器计算其指数的函数初始化它的元素,并已存储在数据部分的结果的C++ 11阵列的一种方式(.RODATA)是使用模板,部分特和constexpr如下:
#include <iostream>
#include <array>
using namespace std;
constexpr int N = 1000000;
constexpr int f(int x) { return x*2; }
typedef array<int, N> A;
template<int... i> constexpr A fs() { return A{{ f(i)... }}; }
template<int...> struct S;
template<int... i> struct S<0,i...>
{ static constexpr A gs() { return fs<0,i...>(); } };
template<int i, int... j> struct S<i,j...>
{ static constexpr A gs() { return S<i-1,i,j...>::gs(); } };
constexpr auto X = S<N-1>::gs();
int main()
{
cout << …Run Code Online (Sandbox Code Playgroud) 如果我创建mmap(2)一个文件用prot的参数,PROT_READ只和文件支持它也是只读的,没有变化,有没有之间的性能差异(或根本任何区别)MAP_SHARED和MAP_PRIVATE?内核会在两者之间做些不同的事吗?
(文档仅指"更新"方面的行为差异,但因为它PROT_READ不存在更新.我想知道是否还有其他差异?)
以下C++ 11程序:
int x = 42;
void f()
{
int y = 43;
static_assert(&x < &y, "foo");
}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
不抱怨使用gcc 4.7进行编译:
error: ‘&y’ is not a constant expression
Run Code Online (Sandbox Code Playgroud)
这符合我的直觉.y每次调用时可能会发生变化的地址f,因此在翻译过程中无法计算.
然而,5.19 [expr.const]中没有一个子弹点似乎排除了它作为一个常量表达式.
我看到的唯一两个竞争者是:
左值到左值的转换......
但除非我弄错了(?),否则程序中没有左值到右值的转换.
和
一个
id-expression引用变量[snip]的除非:
- 它用一个常量表达式初始化
这y是 - 它用常量表达式初始化43.
那么这是标准中的错误,还是我错过了什么?
更新:
令人困惑的是地狱,但我认为我处于最重要的位置,所以让我展示一个展示正在发生的事情的例子:
int x = 42;
void f()
{
int y = 43;
// address constant expressions:
constexpr int* px = &x; // OK
constexpr …Run Code Online (Sandbox Code Playgroud) 我在Linux x86_64上试验ELF可执行文件和gnu工具链:
我已经链接并剥离(手工)"Hello World"测试.:
.global _start
.text
_start:
mov $1, %rax
...
Run Code Online (Sandbox Code Playgroud)
到一个267字节的ELF64可执行文件...
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 d400 4000 0000 0000 ..>.......@.....
0000020: 4000 0000 0000 0000 0000 0000 0000 0000 @...............
0000030: 0000 0000 4000 3800 0100 4000 0000 0000 ....@.8...@.....
0000040: 0100 0000 0500 0000 0000 0000 0000 0000 ................
0000050: 0000 4000 0000 0000 0000 4000 0000 0000 ..@.......@.....
0000060: 0b01 0000 0000 0000 0b01 0000 …Run Code Online (Sandbox Code Playgroud) 根据当前的草案,以下C++ 14/C++ 1y程序是否格式错误?
#include <cstddef>
template<typename T, size_t n>
struct literal_array
{
T data[n];
};
template<typename T, size_t n, size_t m>
constexpr literal_array<T, n+m> operator+(literal_array<T, n> a,
literal_array<T, m> b)
{
literal_array<T, n+m> x;
for (size_t i = 0; i < n; i++)
x.data[i] = a.data[i];
for (size_t i = 0; i < m; i++)
x.data[n+i] = b.data[i];
return x;
}
int main()
{
constexpr literal_array<int, 3> a = { 1, 2, 3 };
constexpr literal_array<int, 2> b = { …Run Code Online (Sandbox Code Playgroud) 假设我有一个数据集,它是一个1e12 32位整数(4 TB)的数组,存储在4TB HDD ext4文件系统的文件中.
考虑到数据很可能是随机的(或者至少是随机的).
// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
SetFileIntAt(i) = GetRandInt();
Run Code Online (Sandbox Code Playgroud)
此外,考虑到我希望以不可预测的顺序读取单个int元素,并且该算法无限运行(它正在进行中).
// pseudo-code
while (true)
UseInt(GetFileInt(GetRand(1<<40)));
Run Code Online (Sandbox Code Playgroud)
我们在Linux x86_64,gcc上.您可以假设系统有4GB的RAM(即比数据集少1000x)
以下是架构访问的两种方法:
(A)将文件mmap到4TB内存块,并将其作为int数组访问
(B)打开(2)文件并使用seek(2)和read(2)来读取整数.
A和B中哪个会有更好的性能?为什么?
是否有其他设计可以提供比A或B更好的性能?
它在C++ std 16.3.4中说:
重新扫描生成的预处理标记序列[来自宏调用替换],以及源文件的所有后续预处理标记,以替换更多的宏名称.
如果在替换列表的扫描期间找到要替换的宏的名称(不包括源文件的其余预处理标记),则不会替换它.
此外,如果任何嵌套替换遇到要替换的宏的名称,则不会替换它.
这些未替换的宏名称预处理令牌不再可用于进一步替换,即使它们稍后(重新)检查在其中否则将替换该宏名称预处理令牌的上下文中.
什么是嵌套的宏替换?
具体考虑:
#define f(x) 1 x
#define g(x) 2 x
g(f)(g)(3)
Run Code Online (Sandbox Code Playgroud)
我原以为是:
g(f)(g)(3) <-- first replacement of g, ok
2 f(g)(3) <-- nested replacement of f, ok
2 1 g(3) <-- second nested replacement of g, don't replace, stop
Run Code Online (Sandbox Code Playgroud)
然而,gcc意外地继续进行第二次替换g,产生:
2 1 2 3
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
更新:
经过大量研究,让我用一个更简单的例子来澄清这个问题:
#define A(x) B
#define B(x) A(x)
A(i)(j)
Run Code Online (Sandbox Code Playgroud)
这扩展如下:
A(i)(j)
B(j)
A(j)
Run Code Online (Sandbox Code Playgroud)
该标准没有规定是否A(j)应该扩展B.委员会决定以这种方式离开,因为预计现实世界的计划不会依赖于这种行为,所以两者都未被A(j)扩展并扩展A(j)到B被认为是符合要求的.
我已经向用户询问了他们的公共"id_rsa.pub"ssh密钥,然后我将其放在"/home/theiraccount/.ssh/authorized_keys"中,以便他们可以通过SSH登录服务器.我想自动化这个过程.
是否有理智检查他们给我的字符串(以编程方式或其他方式)?我想验证sshd可以读取文本,它实际上看起来像一个有效的公钥(并没有被破坏)?
换句话说,id_rsa.pub文件的格式是什么?如果有人在字段中输入,我可以在表单处理程序脚本中写入什么来验证它是否完整和正确?