由于模板是在头文件中定义的,编译器能够确定内联函数是否有利,它是否有意义?我听说现代编译器更好地知道何时内联函数并忽略inline
提示.
编辑:我想接受这两个答案,但这是不可能的.为了解决这个问题,我接受了菲涅耳的回答,因为它收到了大多数选票并且他是正式的,但正如我在评论中所提到的,我从不同的角度考虑Puppy和组件10的答案也是正确的. .
问题出在C++语义中,在inline
关键字和内联的情况下并不严格.Phresnel说"如果你的意思是写内联",但实际意义inline
并不明确,因为它从原来的意义演变为"阻止编译人员讨论ODR违规"的指令,正如Puppy所说.
在Windows上我遇到了一个我从未在Unix上遇到过的问题.这是如何使线程休眠不到一毫秒.在Unix上,您通常有许多选择(睡眠,睡眠和纳米睡眠)以满足您的需求.但是,在Windows上,只有Sleep具有毫秒级的粒度.
在Unix上,我可以使用select
系统调用来创建一个非常简单的微秒睡眠:
int usleep(long usec)
{
struct timeval tv;
tv.tv_sec = usec/1000000L;
tv.tv_usec = usec%1000000L;
return select(0, 0, 0, 0, &tv);
}
Run Code Online (Sandbox Code Playgroud)
如何在Windows上实现相同的目标?
我目前正在开展一个大型项目并且维护所有这些包括警卫让我疯狂!手工编写是令人沮丧的浪费时间.虽然许多编辑可以生成包含警卫,但这并没有多大帮助:
编辑器根据文件名生成保护符号.如果在不同目录中具有相同文件名的标头,则会出现此问题.他们两个都会得到相同的包括后卫.将目录结构包含在保护符号中需要编辑器的一些奇特的方法,因为宏中的斜杠和反斜杠不是最好的.
当我必须重命名文件时,我应该重命名所有包含警戒(在ifndef中,定义和理想的endif的注释).烦人.
预处理器充斥着大量的符号,而不知道它们的含义.
然而,定义包含一次,编译器每次遇到标题包含时仍会打开标题.
包含防护不适合命名空间或模板.实际上他们正在颠覆命名空间!
你的守卫符号有可能不是唯一的.
当程序在单个目录中包含少于1000个标头时,它们可能是可接受的解决方案.但是现在呢?它很古老,与现代编码习惯无关.令我困扰的是,这个问题几乎可以通过#pragma once指令完全解决.为什么不是标准?
我试图理解如何操纵层次结构集群,但文档太......技术性?......我无法理解它是如何工作的.
是否有任何教程可以帮助我开始,逐步解释一些简单的任务?
假设我有以下数据集:
a = np.array([[0, 0 ],
[1, 0 ],
[0, 1 ],
[1, 1 ],
[0.5, 0 ],
[0, 0.5],
[0.5, 0.5],
[2, 2 ],
[2, 3 ],
[3, 2 ],
[3, 3 ]])
Run Code Online (Sandbox Code Playgroud)
我可以轻松地完成层次结构聚类并绘制树形图:
z = linkage(a)
d = dendrogram(z)
Run Code Online (Sandbox Code Playgroud)
[0,1,2,4,5,6]
树状图中有元素的那个?我知道两者之间的差异.一个值得注意的事情是abort()发送SIGABRT信号,因此当您的软件依赖它们时它可能是相关的.但是对于一个典型的应用程序exit()似乎是更安全的abort()版本......?使用abort()而不是exit()还有其他问题吗?
我们在StackOverflow上看到了很多问题,这些问题建立在PHP像Javascript一样的基础上.如果该人明显不理解PHP是Preproccessor并且仅在页面发送之前有效.
一个明显的例子是在下面的代码中,runCommand()
当用户按下按钮时不会运行.
<a href="<?php runCommand(); ?>">Click Me!</a>
Run Code Online (Sandbox Code Playgroud)
就像在Javascript中一样
<a href="javascript:runCommand();">Click Me!</a>
Run Code Online (Sandbox Code Playgroud)
我见过很多这样的问题来自新人,他们根本就没有意识到PHP的运作方式.
我的问题是:解释PHP如何工作的优秀资源在哪里?.
我希望能够将人们重定向到一个页面,这个页面可以让他们走上正确的轨道并知道Preproccessor意味着什么.
(这也让我变得懒惰,每次出现时都不必写一个解释,但不要告诉任何人!)
如果你不知道一个描述这个的地方,请随意提供自己的解释.
正如Carl Smotricz指出的那样,PHP的一部分可以在浏览器之外使用.但我主要是在一个Apache环境中讨论用户请求网页,并希望通过HTML获得回报.
可以在其体外定义类模板的虚函数吗?虚函数不能内联,但为了避免编译单元中的多个定义,应标记它们inline
(假设模板头将包含在多个源文件中).另一方面,编译器可以自由忽略inline
,因此这似乎是有效的.举个例子,下面的代码是正确的:
template <typename T>
class C
{
public:
virtual void f(T val);
};
template <typename T>
inline
void C<T>::f(T val)
{
//definition
}
Run Code Online (Sandbox Code Playgroud)
?
BTW gcc(3.4.2)允许inline
在定义函数f(T val)
之前省略,但不能在常规类的类似函数之前省略.这只是gcc的行为吗?
是否delete ptr
不同于operator delete(ptr)
仅在于此,即delete
调用ptr
析构函数?或者换句话说,delete ptr
首先调用析构函数ptr
然后operator delete(ptr)
释放已分配的内存吗?然后在delete ptr
技术上等同于以下内容:
T * ptr = new T;
//delete ptr equivalent:
ptr->~T();
::operator delete(static_cast<void *>(ptr));
Run Code Online (Sandbox Code Playgroud)
?
可能重复:
是否可以从STL容器继承实现,而不是委托?
我的问题与为什么STL容器没有虚拟析构函数有关?有些人(包括前一个问题的作者)确信没有虚拟dtor意味着类不可继承.我对这样一个强烈的声明持怀疑态度,所以我要求提供来源或一些推理,但大多数受访者保持沉默.也没有人回答我的回答
因此,我认为质疑前一个问题中的假设并澄清这个重要问题是个好主意.STL容器是否设计为允许继承?更一般地说:继承需要虚拟析构函数吗?
它只是我的编译器还是禁止在std :: vector元素中使用cons引用.考虑以下结构:
struct Y
{
const int & x;
Y(const int & p_x):
x(p_x)
{
}
};
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试将这样的对象推送到vector时:
std::vector<Y> yv;
int x = 5;
Y y(x);
yv.push_back(y);
Run Code Online (Sandbox Code Playgroud)
我得到编译器错误:"错误:非静态引用成员`const int&Y :: x',不能使用默认赋值运算符".不应该复制ctor就够了吗?