小编Kar*_*ten的帖子

C/C++中的自展开宏循环

我目前正在开展一个项目,每个周期都很重要.在分析我的应用程序时,我发现一些内部循环的开销非常高,因为它们只包含一些机器指令.另外,这些循环中的迭代次数在编译时是已知的.

所以我认为不是手动展开带有复制和粘贴的循环,而是可以使用宏在编译时展开循环,以便以后可以轻松修改它.

我的形象是这样的:

#define LOOP_N_TIMES(N, CODE) <insert magic here>
Run Code Online (Sandbox Code Playgroud)

所以我可以替换for (int i = 0; i < N, ++i) { do_stuff(); }为:

#define INNER_LOOP_COUNT 4
LOOP_N_TIMES(INNER_LOOP_COUNT, do_stuff();)
Run Code Online (Sandbox Code Playgroud)

它将自己展开:

do_stuff(); do_stuff(); do_stuff(); do_stuff();
Run Code Online (Sandbox Code Playgroud)

由于C预处理器在大多数时间对我来说仍然是一个谜,我不知道如何实现这一点,但我知道它必须是可能的,因为Boost似乎有一个BOOST_PP_REPEAT宏.不幸的是我不能在这个项目中使用Boost.

c c++ macros boost loop-unrolling

14
推荐指数
3
解决办法
2万
查看次数

为什么这个简单的Qt应用程序没有链接

我试着像这样编写一个简单的Qt应用程序:

main.cpp:

#include <QApplication>

class MyApp : public QApplication {
        Q_OBJECT
public:
        MyApp(int argc, char* argv[]);
};

MyApp::MyApp(int argc, char* argv[]) :
        QApplication(argc,argv) {
}

int main(int argc, char* argv[]) {
    MyApp app(argc,argv);
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译并将其与Qt Creator 2.3.1(Qt 4.7.4)链接时,我得到3个"未解析的外部符号"错误:

  • main.obj:-1:错误:LNK2001:未解析的外部符号
    ""public:virtual struct QMetaObject const*__thiscall MyApp :: metaObject(void)const"
    (?metaObject @ MyApp @@ UBEPBUQMetaObject @@ XZ)".

  • main.obj:-1:错误:LNK2001:未解析的外部符号
    ""public:virtual void*__thiscall MyApp :: qt_metacast(char const*)"
    (?qt_metacast @ MyApp @@ UAEPAXPBD @ Z)".

  • main.obj:-1:错误:LNK2001:未解析的外部符号
    ""public:virtual int __thiscall MyApp :: qt_metacall(enum QMetaObject :: Call,int,void**)" …

c++ qt qt4 qt-creator moc

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

如何从 DLL 导入 Cmdlet

是否可以从不在 PATH 目录中的 DLL 导入和调用 Cmdlet?

我想用powershell编写一个能够压缩结果的构建脚本。因此我找到了7Zip4Powershell Cmdlets ( Source ),但我无法调用它们。

dll powershell cmdlets build

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

如何使用来自另一个.NET程序的交互式命令行程序

我需要为交互式命令行程序编写一个包装器.

这意味着我需要能够通过其标准输入向其他程序发送命令,并通过其标准输出接收响应.

问题是,当输入流仍处于打开状态时,标准输出流似乎被阻止.一旦我关闭输入流,我就得到响应.但后来我无法发送更多命令.

这就是我目前使用的(主要来自这里):

void Main() {
    Process process;
    process = new Process();
    process.StartInfo.FileName = "atprogram.exe";
    process.StartInfo.Arguments = "interactive";

    // Set UseShellExecute to false for redirection.
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;

    // Redirect the standard output of the command.  
    // This stream is read asynchronously using an event handler.
    process.StartInfo.RedirectStandardOutput = true;
    // Set our event handler to asynchronously read the output.
    process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);

    // Redirect standard input as well. This stream is …
Run Code Online (Sandbox Code Playgroud)

.net c# command-line pipe redirectstandardoutput

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

为什么这个LINQ查询异常慢?

我编写了以下内容,将字节数组转换为包含32个字节(作为每个条目的十六进制字符串)data的字符串数组hex,以将它们写入文件。

byte[] data = new byte[4*1024*1024];
string[] hex = data.Select((b) => b.ToString("X2")).ToArray();
hex = Enumerable.Range(0, data.Length / 32).Select((r) => String.Join(" ", hex.Skip(r * 32).Take(32))).ToArray();  // <= This line takes forever
Run Code Online (Sandbox Code Playgroud)

问题是,尽管生成的文件小于20MB,但仍需要几分钟(!)才能完成。因此,我尝试对其进行优化,并提出了以下建议:

byte[] data = new byte[4*1024*1024];
string[] hex = new string[4*1024*1024/32];
for (var i = 0; i <= hex.Length - 1; i++)
{
    var sb = new System.Text.StringBuilder();
    sb.Append(data[i * 32].ToString("X2"));
    for (var k = 1; k <= 32 - 1; k++)
    {
        sb.Append(' ');
        sb.Append(data[i …
Run Code Online (Sandbox Code Playgroud)

.net c# linq performance

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

C++:将隐式复制结构

我对 C++ 比较陌生,我想知道在以下情况下是否复制了结构:

struct foo {
  int i;
  std::vector<int> bar;
}

class Foobar {
  foo m_foo;

  void store(foo& f) {
    this->m_foo = f;
  }
}

void main() {
  Foobar foobar;
  {
    foo f;
    f.i = 1;
    f.bar.insert(2);
    foobar.store(f);
  }
  // will a copy of f still exist in foobar.m_foo, or am I storing a NULL-Pointer at this point?
}
Run Code Online (Sandbox Code Playgroud)

我问这个的原因是我最初是一个 .NET 开发人员,如果你将它们传递给一个函数(而类不是),那么在 .NET 结构中将被复制。我很确定如果 store 没有被声明为通过引用获取 f ,它会被复制,但我无法更改此代码。

编辑:更新了代码,因为我不知道这vector.insert会影响我的问题。在我的情况下,我将结构存储为类中的成员,而不是向量。所以我的问题真的是:会f被复制this->m_foo = f;吗?

c++ struct copy pass-by-reference null-pointer

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

如果散列,为什么要使用经过身份验证的加密?

与更简单的方法(如 CRC)或散列函数(如 SHA)相比,使用 GCM 或 EAX 等经过身份验证的加密方案有什么好处?

据我了解,这些方法基本上是在消息中添加消息身份验证代码 ( MAC ),以便对其进行验证。但是,如果将计算 CRC 或哈希值并将其附加到明文 ( MIC ) 中,则同样可能。这样也无法篡改消息,因为散列可能不再匹配。

链接的维基百科文章说 MIC 不考虑密钥等,但我不明白为什么这是一个问题。

security authentication encryption hash aes-gcm

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

#include包含的头文件已包含的头文件是否普遍可行?

假设我们有一个头文件A.h,它依赖于B.h和中声明的内容C.hB.h也取决于C.h,因此也包括在内。在这种情况下,我们不需要包含C.h进去A.h,没有它就可以编译。

但是我想知道在这些情况下最好的行动方案是什么。如果B.h以某种方式更改并且不再依赖C.hA.h则会中断。

另一方面,如果我认为到最后,重新包含所有单个依赖关系似乎是不必要/不切实际的。

我常见的情况是标准库。在几乎所有的头文件中,我都必须包含<stdint.h><stdbool.h>。我经常跳过它,因为它们已经包含在其中一个依赖项中,但这总是感觉有些武断。

c c++ dependencies include dependency-management

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