我正在阅读:
"C++标准库:Nicolai M. Josuttis的教程和参考"
我在关于集合和多重集的部分.我遇到了关于插入和删除元素的一行:
"如果在使用多个元素时,对所有元素使用单个调用而不是多个调用,则插入和删除的速度会更快."
我远不是数据结构大师,但我知道它们是用红黑树实现的.我不明白的是,STL实现者如何编写算法以更快的方式一次插入多个元素?
任何人都可以解释为什么这句话对我来说是真的吗?
我正在读一本书(UNIX环境中的高级编程),我正在阅读有关信号的部分.
使用信号功能时:
void (*signal(int signo, void (*func)(int)))(int);
Run Code Online (Sandbox Code Playgroud)
参数func可以是指向用户定义的函数的指针,也可以是SIG_ERR,SIG_DFL或SIG_IGN.
我的问题不在UNIX的部分,但我想提供背景知识.我真正想知道的是,这本书指出这些常数是不确定的:
#define SIG_ERR (void (*)())-1
Run Code Online (Sandbox Code Playgroud)
等等为0和1.
现在,我有一些不错的猜测,但为了节省时间 - 有人能告诉我这是做什么以及它为什么有效?
还有......呃......干净吗?假设我使用C++并与此C API交互,写这个的方法?
阅读:有效的Java - 第二版由Joshua Bloch撰写
第8项 - 当超越等于国家时遵守总合同:
程序员编写一个看起来像这样的equals方法,然后花费数小时来解释为什么它不能正常工作的情况并不少见:
[此处代码示例]
问题是此方法不会覆盖Object.equals,其参数类型为Object,但会重载它.
代码示例:
public boolean equals(MyClass o) {
//...
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
为什么强类型的equals方法像这个代码示例中的那样重载不够?该书指出,重载而不是覆盖是不好的,但它没有说明为什么会出现这种情况或者什么情况会使这种等于方法失败.
UNIX环境中的高级编程由W. Richard Stevens指出:
"主函数中自动变量和寄存器变量的状态是什么?"
关于当你longjmp从堆栈下面的某个地方回到main(或另一个函数)时会发生什么.
它继续说:
"这取决于.大多数实现不会尝试回滚这些自动变量并注册变量,但标准所说的都是它们的值是不确定的.如果你有一个你不想回滚的自动变量,用它来定义它在
volatile当被声明全局或静态属性.变量单独留在家中longjmp被执行.
看起来他说正常的堆栈变量不会将它们的值设置回setjmp时的值 - 但是在longjmp返回之后,函数的其余部分不能依赖于它的堆栈变量.看起来很疯狂,所以我猜我错了.
有人可以为我定义"自动变量"并解释具体没有恢复到原始值的原因以及为什么会这样?
我对这段代码中显示的情况感到有点困惑......
class DirEnt
{
public function PopulateDirectory($path)
{
/*... code ...*/
while ($file = readdir($folder))
{
is_dir($file) ? $dtype = DType::Folder : $dtype = Dtype::File;
$this->push_back(new SomeClass($file, $dtype));
}
/*... code ...*/
}
//Element inserter.
public function push_back($element)
{
//Insert the element.
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我需要使用$this->push_back(new SomeClass($file, $dtype))或 self::push_back(new SomeClass($file, $dtype))调用成员函数push_back?我似乎无法push_back(new SomeClass($file, $dtype))像我期望的那样访问它.我读过什么时候使用自我超过$ this?但它没有回答为什么我需要其中一个(或者如果我一直这样做,也许我搞砸了别的东西).
当成员是非静态成员并且在同一个类中时,为什么需要此规范?不应该从同一个类中的其他成员函数中看到并知道所有成员函数吗?
PS:它可以很好地工作$this->,self::但是当电话中没有这些功能时,这些功能都是未知的push_back.
我知道STL关联容器(以及我猜的其他容器正在排序)使用排序标准来测试相等性.
容器的排序标准默认为st :: less,因此将对容器进行相等性测试:
if (! (lhs < rhs || rhs < lhs))
Run Code Online (Sandbox Code Playgroud)
或类似的东西.我对此有几个问题......
首先,它似乎是比较平等的一种奇怪的低效方式 - 为什么STL会这样做?我原本期望STL容器只是为了相等而采用额外的默认参数.
我的第二个问题更多是关于对上述if语句的评估.在C++中,将评估该语句的多少(lhs> rhs)是真的?它会在评估失败的一方后停止尝试,从而节省一些效率吗?如果是这样,首先评估表达式的哪一部分?
我通常习惯于以这种方式实现单例模式,因为它很容易:
class MyClass
{
public:
MyClass* GetInstance()
{
static MyClass instance;
return &instance;
}
private:
//Disallow copy construction, copy assignment, and external
//default construction.
};
Run Code Online (Sandbox Code Playgroud)
这似乎比创建静态实例指针,在源文件中初始化它,以及在带有保护的实例函数中使用动态内存分配要容易得多.
有没有我没有看到的缺点?它看起来对我来说是线程安全的,因为我认为第一个到达第一行的线程会导致实例化 - 而且看起来很简洁.我认为必须有一个问题,我没有看到,因为这不常见 - 我想在我继续使用它之前得到一些反馈
假设我有两个变量,protected_var1并且protected_var2.让我们进一步假设这些变量是通过多个线程更新的,并且相当独立,通常是一个或另一个但不是两个都被处理 - 因此它们都有自己的互斥保护以提高效率.
假设:
- 我总是在需要两个锁的区域中按顺序锁定互斥锁(mutex1然后是mutex2).
-both互斥体被其他许多地方使用(比如只需要锁定mutex1,或者只是锁定mutex2).
在这种情况下,使用两者在函数结尾处解锁互斥锁的顺序是否有所不同?
void foo()
{
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
int x = protected_var1 + protected_var2;
pthread_mutex_unlock(&mutex1); //Does the order of the next two lines matter?
pthread_mutex_unlock(&mutex2);
}
Run Code Online (Sandbox Code Playgroud)
很久以前我在一次关于这种情况的采访中被问到一个问题,我觉得答案是肯定的 - 这两个解锁的顺序很重要.我不能为我的生活弄清楚如何在这两者被使用的情况下以相同的顺序获得锁定时如何导致死锁.
我知道我可能会用这个问题击败死马,但我有点困惑,我还没有找到SO或谷歌的确切答案(我有信心是对的 - 这里有太多的信息在C字符串上筛选).另外,我已经将它标记为C++,因为这是我感兴趣的,即使我们特别谈论的是C风格的字符串.
在这种情况下:
char const a* = "hello";
char const b[] = "goodbye";
Run Code Online (Sandbox Code Playgroud)
我本来以为"你好"和"再见"是不可变的字符串,因为它们来自应衰减到一个char*常量字符串常量.
我已经看到了,在这种特殊情况下,虽然,改变"你好"将是不确定的,同时改变"再见"就可以了,假设你剥去从B数组常量性.
我假设在b的情况下字符串是可变的,因为它存储在用户定义的数组中.
在这种情况下,你好,再见不同吗? 在这个例子中,由于某些原因,再见不是字符串文字.另外,如果再见不是字符串文字,我可以假设它不在全局内存中,并且在编译时间之后对它的唯一引用是留在用户数组单元格中吗?
如果我使用泛型,就像在这个示例中一样,有没有办法缩短语法,所以我不必重复输入"CompanyLookupData"?
Func<CompanyLookupData, CompanyLookupData, bool> DELCompareNonKeyFieldsCompany =
new Func<CompanyLookupData, CompanyLookupData, bool>
(CompanyLookupData.HasIdenticalNonKeyFieldsTo);
Run Code Online (Sandbox Code Playgroud)
我试图这样做Type t = typeof(CopmanyLookupData),并t在所有位置使用,但这似乎不起作用.
PS:虽然我愿意采用更清晰的方式来完成所显示的内容,但我更感兴趣的是一种使泛型语法更简洁的方法.