大多数SQL方言都接受以下查询:
SELECT a.foo, b.foo
FROM a, b
WHERE a.x = b.x
SELECT a.foo, b.foo
FROM a
LEFT JOIN b ON a.x = b.x
Run Code Online (Sandbox Code Playgroud)
现在很明显,当您需要外连接时,需要第二种语法.但是在进行内部连接时,为什么我更喜欢第二种语法(反之亦然)?
我知道关于const正确性的问题很少,其中声明函数的声明及其定义不需要同意值参数.这是因为值参数的常量仅在函数内部很重要.这可以:
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
Run Code Online (Sandbox Code Playgroud)
这样做真的是最好的做法吗?因为我从未见过有人这样做过.我已经在其他地方看过这个引用(不确定来源),这已被讨论过:
"事实上,对于编译器,无论是否在值参数前面包含此const,函数签名都是相同的."
"避免在函数声明中使用const值传递参数.如果不修改参数const,则仍然将参数const置于同一函数的定义中."
第二段说不要将const放在声明中.我假设这是因为值参数的常量作为接口定义的一部分是没有意义的.这是一个实现细节.
根据这个建议,是否也建议指针参数的指针值?(它对参考参数没有意义,因为您无法重新分配参考.)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i; …
Run Code Online (Sandbox Code Playgroud) 最近看到有人赞扬另一个用户使用sizeof var而不是sizeof(type).我一直以为这只是一种风格选择.有什么显着差异吗?例如,具有f和ff的线被认为比具有g和gg的线更好:
typedef struct _foo {} foo;
foo *f = malloc(count * sizeof f);
foo *g = malloc(sizeof(foo) * count);
foo **ff = malloc(count * sizeof *ff);
foo **gg = malloc(sizeof(foo*) * count);
Run Code Online (Sandbox Code Playgroud)
在我看来,第一组只是风格问题.但是在第二对线中,额外的第二个*很容易混淆乘法.
在C++中使用指针和引用时,有时很难看出指针是否对引用的数据具有所有权,或者它是否只是时间引用.例如:
Instance* i = new Instance();
Instance* j = i;
Run Code Online (Sandbox Code Playgroud)
如何弄清楚哪两个指针对实例拥有所有权?换句话说,如何明确必须调用哪个指针删除?
注意:在上面的例子中,这不难看出,因为它是一段很短的代码.但是,当指针被复制并传递很多时,这可能会变得不清楚.
如今,使用C++而不是托管语言的主要原因是为了获得C++带来的好处.C++的支柱之一是"你不为你不需要的东西买单".可以说有时候你不想支付与C的向后兼容性.许多奇怪的C++怪癖可以归结为这种向后兼容性.还有哪些其他语言,"你不为你不需要的东西买单",包括向后兼容C?
编辑/澄清:对我来说,真正的杀手是第二句话.是否有一种真正设计的语言,并没有强加你不想要的代码?C++将其作为其设计理念:不想要RTTI?它不存在.不想要垃圾收集?它不在那里.C++的问题在于它(IMO)在拒绝与过去相冲突时违反了这一要求.我不希望与20岁代码的向后兼容性阻碍我的前进.C++不愿意这样做.什么是/有?
编辑2:我想我应该更清楚一下成本是多少.有多种潜在成本.我最初关注的是运行时成本.
在C++中,通过虚方法的多态性有成本.但并非所有方法都支付这笔费用.调用非虚拟C++方法,其运行时成本与普通旧C函数(具有至少一个参数)相同.C++不要求您使用多态.在其他OOP语言中,所有方法都是虚拟的,因此无法避免多态性的成本.
运行时成本是最重要的,但其他成本可以减轻这种影响.汇编语言显然会有最少的运行时开销,但汇编语言的编写和维护成本是一个巨大的打击.
考虑到这一点,我们的想法是找到提供有用抽象的语言,这些抽象在不使用时不会影响运行时成本.
给定PyObject*指向python对象,如何调用其中一个对象方法?文档从未举例说明:
PyObject* obj = ....
PyObject* args = Py_BuildValue("(s)", "An arg");
PyObject* method = PyWHATGOESHERE(obj, "foo");
PyObject* ret = PyWHATGOESHERE(obj, method, args);
if (!ret) {
// check error...
}
Run Code Online (Sandbox Code Playgroud)
这相当于
>>> ret = obj.foo("An arg")
Run Code Online (Sandbox Code Playgroud) SELECT webcal_entry.cal_id, webcal_entry.cal_name , webcal_entry.cal_priority,
webcal_entry.cal_date , webcal_entry.cal_time , webcal_entry_user.cal_status,
webcal_entry.cal_create_by , webcal_entry.cal_access, webcal_entry.cal_duration ,
webcal_entry.cal_description , webcal_entry_user.cal_category
FROM webcal_entry, webcal_entry_user
WHERE webcal_entry.cal_date BETWEEN '20090601' AND '20090631'
Run Code Online (Sandbox Code Playgroud)
当我执行该查询时,php会抛出:
mysql_query(): unable to save result set
MySQL client ran out of memory
Run Code Online (Sandbox Code Playgroud)
当我限制结果时,我发现它正在回收大约280万个结果.该表有7,241行.
我意识到我可以使用LIKE,但我真的不想走那条路.
谢谢你的帮助!