小编mre*_*555的帖子

while循环比循环更有效

有人告诉我,while循环比for循环更有效.(c/c ++)这似乎很合理,但我想找到一种证明或反驳它的方法.

我尝试使用类似的代码片段进行三次测试.每个包含Nothing但具有相同输出的for或while循环:

  1. 编译时间 - 大致相同
  2. 运行时间 - 相同
  3. 编译成英特尔汇编代码并进行比较 - 相同数量的行和几乎相同的代码

我应该尝试过其他任何东西,还是任何人都可以通过某种方式确认?

c++

5
推荐指数
1
解决办法
1933
查看次数

glibc的atomic_forced_read函数的目的是什么?

我试图理解atomic_forced_read定义的目的,它经常出现在malloc.c的GNU libc实现中。

我不太擅长内联汇编,但看起来这会返回完全相同的值,并且类型与输入值相同。我在这里缺少什么?

原子强制读取定义在atomic.h中

523 #ifndef atomic_forced_read
524 # define atomic_forced_read(x) \
525   ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; })
526 #endif
Run Code Online (Sandbox Code Playgroud)

链接到atomic.h

https://code.woboq.org/userspace/glibc/include/atomic.h.html

c glibc atomic libc inline-assembly

5
推荐指数
1
解决办法
507
查看次数

在powershell中创建目录快捷方式

我正在编写我的第一个 powershell 脚本,但遇到了一些麻烦。

到目前为止,我的系统创建了一个目录树并用文件填充它。最后一步是在我的桌面上放置一个快捷方式。

我想出了下面的代码:

$ShortcutFile = "$home\Desktop\" + $protocol + ".lnk"
If ( (test-path -path "$ShortcutFile") -ne $true)
{
    $WScriptShell = New-Object -ComObject WScript.Shell
    $Shortcut = $WScriptShell.CreateShortcut($ShortcutFile)
    $Shortcut.TargetPath = $root_path
    $Shortcut.Save()
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的,我相信任何有经验的 powershell 用户都知道。创建文件而不是目录。我想解决此问题的正确方法是更改​​ WScript.Shell 中控制文件类型的对象成员之一。我没有找到任何关于如何具体执行此操作的资源,或任何其他方法来执行此操作。我在 MSDN 网站上找到了该 API,但那里只列出了几个成员。一定还有更多。实现这一目标的最佳方法是什么?

谢谢

powershell

4
推荐指数
1
解决办法
1万
查看次数

什么时候使用抽象类有意义

我正在从c过渡到c ++,当然,OOP比事实证明要困难得多。困难不是了解类和继承的核心机制,而是如何使用它。我读过有关设计模式的书,但它们只展示了技术,并为应为什么使用这些技术画了模糊的图画。我真的很难找到抽象类的用途。以下面的代码为例。

class baseClass {
public:
    virtual void func1() = 0;
    virtual void func2() = 0;
};
class inhClass1 : baseClass {
public:
    void func1();
    void func2();
};
class inhClass2 : baseClass{
public:
    void func1();
    void func2();
};
int main() {}
Run Code Online (Sandbox Code Playgroud)

我经常在设计书中看到像这样设置的抽象类。我知道,通过这种配置,继承的类可以访问基类的公共成员。我知道虚函数是继承类的占位符。问题是我仍然不明白这有什么用。我正在尝试将其与重载函数进行比较,而我只是没有看到实际的用途。

我真正想要的是提供一个尽可能简单的示例来说明为什么抽象类实际上是有用的,并且是针对某种情况的最佳解决方案。不要误会我的意思。我并不是说没有一个好的答案。我只是不明白如何正确使用它们。

c++ oop abstract-class

4
推荐指数
1
解决办法
732
查看次数

布尔值对位域的优点

我工作的代码库很旧。虽然我们用 c++11 编译几乎所有东西。许多代码是多年前用c 编写的。在旧领域开发新课程时,我总是发现自己必须在匹配旧方法或采用更现代的方法之间做出选择。

在大多数情况下,我更喜欢尽可能坚持使用更现代的技术。然而,我经常看到的一个常见的旧做法是位域,我很难争论它的使用。我们传递了很多消息,很多时候,它们都充满了单个位值。以下面的例子为例:

class NewStructure
{
public:

    const bool getValue1() const
    {
        return value1;
    }

    void setValue1(const bool input)
    {
        value1 = input;
    }

private:
    bool value1;
    bool value2;
    bool value3;
    bool value4;
    bool value5;
    bool value6;
    bool value7;
    bool value8;
};

struct OldStructure
{
    const bool getValue1() const
    {
        return value1;
    }

    void setValue1(const bool input)
    {
        value1 = input;
    }

    unsigned char value1 : 1;
    unsigned char value2 : 1;
    unsigned char value3 : 1;
    unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ boolean bit-fields

1
推荐指数
1
解决办法
450
查看次数

std::thread 最大并发线程数

我正在尝试理解 中的一些基本概念std::thread,但我对此仍然没有信心。根本问题是:

当我超过 的值时实际发生了什么std::thread::hardware_concurrency(),就像我在下面所做的那样?

我知道该方法只是一个提示,但在这种情况下 8 应该是准确的。我没有看到任何警告或错误,那么到底发生了什么?

join()我怀疑这与我对和缺乏理解有关detach(),这让我想到了第二个问题。

join()我知道如果我在没有 a或 a 的情况下启动线程detach(),我将收到运行时错误。据我从阅读和观察中了解到,join()导致线程阻塞直到完成执行,而detach()基本上相反,允许线程疯狂运行直到完成,如果该线程不终止,则可能会打开一罐蠕虫它自己的。

join()根据我的观察,和的用法似乎detach()是相互排斥的。这是错误的吗?为什么我需要在同一个线程上使用join()and ?detach()

就我的第一个问题而言,我什至无法开始猜测。我预计会出现某种类型的运行时错误,或者一些更明显的强制阻塞。

#include <ctime>
#include <cstdlib>
#include <iostream>
#include <thread>
#include <vector>

std::vector<unsigned> getNumbers(unsigned n)
{
    std::vector<unsigned> out;
    while(n > 0)
    {
        out.push_back(rand());
        n--;
    }
    return out; 
}

int main() {
    srand(time(nullptr));
    std::vector<std::thread> threads;
    unsigned maxThreads = std::thread::hardware_concurrency();
    std::cout << "Max threads: " << maxThreads << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency multithreading stdthread

1
推荐指数
2
解决办法
4979
查看次数

在类成员中初始化变量是不好的做法吗?

如果变量的预期范围是真正的本地范围,那么保持这种方式对我来说是有意义的.这就是我一直以来所做的.但是我最近在工作时从vim切换到eclipse,如果构造函数中没有初始化每个成员变量,eclipse会标记我的构造函数.例如,在下面的代码中,它编译得很好.g ++没问题.另一方面,Eclipse告诉我'a'应该在构造函数中初始化.

有什么理由可以说这个警告可能是相关的,还是值得忽略所有这些?

class C
{
public:
    C(){}
    ~C(){}
    void foo();
};

void C::foo()
{
    int a;
}

int main() {
    C c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ object-initializers

0
推荐指数
1
解决办法
113
查看次数