似乎2 is 2并且3 is 3在python中总是如此,并且通常,对整数的任何引用都与对同一整数的任何其他引用相同.同样的情况,以None(即None is None).我知道,这并没有发生在用户定义的类型或可变类型.但它有时也会在不可变类型上失败:
>>> () is ()
True
>>> (2,) is (2,)
False
Run Code Online (Sandbox Code Playgroud)
也就是说:空元组的两个独立构造产生对内存中相同对象的引用,但是相同的一个(不可变)元素元组的两个独立构造最终创建两个相同的对象.我测试了,并且frozenset以类似于元组的方式工作.
是什么决定了一个对象是在内存中复制还是会有一个包含大量引用的实例?它取决于对象在某种意义上是否是"原子"的?它是否因实施而异?
该pickle参考文献指出可以酸洗的物体组是相当有限的.实际上,我有一个函数返回一个dinamically生成的类,我发现我不能pickle该类的实例:
>>> import pickle
>>> def f():
... class A: pass
... return A
...
>>> LocalA = f()
>>> la = LocalA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(la, f, pickle.HIGHEST_PROTOCOL)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: Can't pickle local object 'f.<locals>.A'
Run Code Online (Sandbox Code Playgroud)
这些对象太复杂了pickle.好.现在,有什么神奇的,如果我试图挑选一个类似的对象,但是派生类,它就可以了!
>>> class DerivedA(LocalA): pass
...
>>> da = DerivedA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(da, f, pickle.HIGHEST_PROTOCOL)
...
>>>
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?如果这很容易,为什么不 …
我正在尝试使用 typedef 来理解函数声明。
这段代码在 C++ 中有什么作用?
typedef void fcn_t(void);
typedef void (*ptr_t)(void);
fcn_t f;
fcn_t *pf;
ptr_t pf2;
Run Code Online (Sandbox Code Playgroud)
以我的理解:
fcn_t是函数的类型,所以用 withf是函数声明(不是定义),以后我可以像定义它一样定义它,就像void f(void) { blabla(); bleble(); }我声明了void f(void);而不是fcn_t f;;fcn_t *是函数指针的类型,行pf是指针变量定义,并且pf是默认初始化的(假设代码摘录来自全局范围);fcn_t*和之间没有区别ptr_t,因此我所说的一切都pf适用于pf2。我做对了吗?如果我标记它们,这三个声明中的任何一个都会改变其含义extern吗?如果将代码编译为 C 而不是 C++ 会发生什么变化?
我有QSlider和QSpinBox,我希望它们的值始终相等,所以我将滑块的valueChanged(int)信号连接到旋转盒的setValue(int)插槽,反之亦然:(当然,我还将最小值和最大值设置为相等) )
connect(delay_slider, SIGNAL(valueChanged(int)),
delay_spin, SLOT(setValue(int)));
connect(delay_spin, SIGNAL(valueChanged(int)),
delay_slider, SLOT(setValue(int)));
Run Code Online (Sandbox Code Playgroud)
我测试了,它的工作原理(至少在我的Ubuntu 12.04 LTS x86_64,g ++ 4.6.3,Qt 4.8.1上).
现在,我认为当我发出其中一个信号时,它会触发另一个信号,这将触发第一个,这将触发另一个,等等.Qt如何处理?是否有描述所用机制的文件?
Obs:我称之为"事件循环发出",因为这与Qt事件循环无关
以下程序正确编译:
#include <algorithm>
int main(int argc, char *argv[]) {
return int(log(23.f));
}
Run Code Online (Sandbox Code Playgroud)
(根据g ++ 4.9.2与旗帜-std=c++11)
代码使用log定义的函数<cmath>.但是,它不包括标题<cmath>,只包括标题<algorithm>.为什么g++不提供任何警告,并正确编译代码?
因此,回到 GCC 10.2(默认使用 C++14),我可以用它来告诉 CMake 我想要-std=gnu++17:
target_compile_features(mytarget PRIVATE cxx_std_17)
set_target_properties(mytarget PROPERTIES
CXX_STANDARD_REQUIRED ON
)
Run Code Online (Sandbox Code Playgroud)
...这实际上是我不想要的,所以我曾经CXX_EXTENSIONS OFF强迫-std=c++17:
target_compile_features(mytarget PRIVATE cxx_std_17)
set_target_properties(mytarget PROPERTIES
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF # -std=c++17 instead of gnu++17
)
Run Code Online (Sandbox Code Playgroud)
输入海湾合作委员会 11.1。现在默认是 2017 版本的 ISO C++ 标准,因此上面的第一个代码片段不会为 GCC 生成任何 -std标志,这与 GCC 11 的手册页兼容:
c++17:2017 年 ISO C++ 标准及修订版。
gnu++17: 的 GNU 方言-std=c++17。这是 C++ 代码的默认设置。
问题是上面的第二个 CMake 片段也没有生成任何-stdflag。我现在该怎么做,这是 CMake 中的错误吗?我如何告诉它我想要一个显式-std=c++17标志? …
我想在compile命令中传递一个版本字符串:
$ g++ -Wall -D VERSION="2013-12-03 02:15:21, commit cb060df" -o main main.cpp
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我有以下内容:
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(x)
#define VERSION_STR STRINGIFY(VERSION)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为VERSION宏中有一个逗号,所以看起来我传递了两个参数TOSTR()(显然,VERSION宏只有在STRINGIFY()作为一个唯一参数传递后才会被扩展).
我在这里找到的以下方法也不起作用:
#define CONCAT(...) __VA_ARGS__
#define TOSTR_(x) #x
#define STRINGIFY(x) TOSTR_(CONCAT(x))
#define VERSION_STR STRINGIFY(VERSION)
Run Code Online (Sandbox Code Playgroud)
因为这似乎是相同的
#define VERSIONSTR "CONCAT(2013-12-03 02:15:21, commit cb060df)"
Run Code Online (Sandbox Code Playgroud)
也就是说,宏CONCAT()不会扩展.
注1:我宁愿不在命令行中传递一个C字符串,因为版本字符串实际上是动态生成的,它可能包含一些引号.这意味着只写g++ -D VERSION=\""$(GENERATED_STRING)"\"而不是对传递的参数进行字符串化是行不通的.
注2:如果有人在没有任何预处理器宏的情况下找到了这样做的方法,我会非常高兴.
在C++中,如果我初始化a std::vector v(100);并且从不尝试resize()也不尝试reserve(),是否capacity()保证始终保持不变?我想确保没有内存alloc/freeing/realloc/etc出于性能原因.(是的,它会影响性能;我的功能一直被调用,它们必须快速返回).
全部恢复:
std::vector<float> v;
// somehow, `v' is initialized to have 100 elements
void f() { // this function must return _very_ quickly
/* do some processing, without ever calling v.resize() or v.reserve(), but
accesing v.size() and v[i] all the time */
/* it is guaranteed that no system calls (such as memory management)
will take place here? */
} // no objects on the stack whose destroyers might …Run Code Online (Sandbox Code Playgroud)