我正在学习Bjarne Stroustrup的"C++编程语言",他讲的是类的逻辑和物理常量.
逻辑constness的例子是这样的:
class A {
int m;
void func() const { m++; } //forbidden
}
Run Code Online (Sandbox Code Playgroud)
可以通过演员来绕过这个,例如:
class A {
int m;
void func() const { (A*) this)->m++; } //allowed
}
Run Code Online (Sandbox Code Playgroud)
用他的话说,逻辑常数是
"一个对用户来说似乎不变的对象."
和物理常数是
"存储在只读存储器中"
作为一个说明,他说
物理常量可以通过仅在没有构造函数的类中将对象放置在只读存储器中来实施
我不太明白这个说法.有人可以解释如何强制执行物理常量以及如果类有构造函数它不起作用的原因吗?
我可以想到三种填充方式 std::vector
假设我们有
vector<int> v(100, 0);
Run Code Online (Sandbox Code Playgroud)
然后我想要它(1,1,1).我们可以做的:
v.clear();
v.resize(3, 1);
Run Code Online (Sandbox Code Playgroud)
要么
v = vector<int>(3, 1);
Run Code Online (Sandbox Code Playgroud)
我学到了另一种方法:
vector<int>(3, 1).swap(v);
Run Code Online (Sandbox Code Playgroud)
第一个问题是:它们中的任何一种都是最好的方法吗?
第二个问题:假设v在主要功能之外被宣布.根据这个答案,存储器将被分配在数据段中.如果我使用第二种或第三种方法,是否会在堆栈上分配内存?
我试图以更迫切的方式表达一组链式调用.例如,image我们有一个带有列表和元素的函数,它将元素追加到列表的末尾:
let insert l e =
l @ [e]
Run Code Online (Sandbox Code Playgroud)
我想一次插入一些元素.一种功能性的方法可能是:
let myList = insert (insert (insert [] 3) 4) 5)
Run Code Online (Sandbox Code Playgroud)
我最近了解了有关|>表达性的操作符.与currying一起,它可以导致干净的链接.问题是我们需要先绑定第二个参数.这需要定义一个函数来反转参数(这实际上是|>:P):
let myList =
let insertIn l e = insert e l in
[] |>
insertIn 3 |>
insertIn 4 |>
insertIn 5
;;
Run Code Online (Sandbox Code Playgroud)
这几乎是我想要的,除了需要定义insertIn.有更清洁的方法吗?
我希望有一个特殊的运算符$,它可以表示前一个函数的返回值:
let myList =
[] |>
insert $ 3 |>
insert $ 4 |>
insert $ 5
;;
Run Code Online (Sandbox Code Playgroud) 我正在使用Open MPI库来实现以下算法:我们有两个进程p1和p2.他们都在执行一些迭代,并且在每次迭代结束时,他们都会传达他们的结果.问题是执行不一定是平衡的,所以p1可以执行10次迭代p2执行1.尽管如此,我想p2读取上次执行的迭代的最新结果p1.
因此,我的想法是p1在每次迭代时发送其结果.但是,在从迭代发送结果之前i,它应检查是否p2实际从迭代中读取信息i-1.如果没有,它应该取消之前的发送,这样当p2读取时p1,它将读取最新的结果.
不幸的是,我不知道该怎么做.我尝试过使用MPI_Cancel,如下面的代码所示:
int main (int argc, char *argv[]){
int myrank, numprocs;
MPI_Status status;
MPI_Request request;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
if(myrank == 0){
int send_buf = 1, flag;
MPI_Isend(&send_buf, 1, MPI_INT, 1, 123, MPI_COMM_WORLD,
&request);
MPI_Cancel(&request);
MPI_Wait(&request, &status);
MPI_Test_cancelled(&status, &flag);
if (flag) printf("Send cancelled\n");
else printf("Send NOT cancelled\n");
send_buf = 2; …Run Code Online (Sandbox Code Playgroud)