我目前正在开展一个项目,每个周期都很重要.在分析我的应用程序时,我发现一些内部循环的开销非常高,因为它们只包含一些机器指令.另外,这些循环中的迭代次数在编译时是已知的.
所以我认为不是手动展开带有复制和粘贴的循环,而是可以使用宏在编译时展开循环,以便以后可以轻松修改它.
我的形象是这样的:
#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.
我试着像这样编写一个简单的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**)" …
是否可以从不在 PATH 目录中的 DLL 导入和调用 Cmdlet?
我想用powershell编写一个能够压缩结果的构建脚本。因此我找到了7Zip4Powershell Cmdlets ( Source ),但我无法调用它们。
我需要为交互式命令行程序编写一个包装器.
这意味着我需要能够通过其标准输入向其他程序发送命令,并通过其标准输出接收响应.
问题是,当输入流仍处于打开状态时,标准输出流似乎被阻止.一旦我关闭输入流,我就得到响应.但后来我无法发送更多命令.
这就是我目前使用的(主要来自这里):
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) 我编写了以下内容,将字节数组转换为包含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) 我对 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;
吗?
假设我们有一个头文件A.h
,它依赖于B.h
和中声明的内容C.h
。B.h
也取决于C.h
,因此也包括在内。在这种情况下,我们不需要包含C.h
进去A.h
,没有它就可以编译。
但是我想知道在这些情况下最好的行动方案是什么。如果B.h
以某种方式更改并且不再依赖C.h
,A.h
则会中断。
另一方面,如果我认为到最后,重新包含所有单个依赖关系似乎是不必要/不切实际的。
我常见的情况是标准库。在几乎所有的头文件中,我都必须包含<stdint.h>
和<stdbool.h>
。我经常跳过它,因为它们已经包含在其中一个依赖项中,但这总是感觉有些武断。
c++ ×4
.net ×2
c ×2
c# ×2
aes-gcm ×1
boost ×1
build ×1
cmdlets ×1
command-line ×1
copy ×1
dependencies ×1
dll ×1
encryption ×1
hash ×1
include ×1
linq ×1
macros ×1
moc ×1
null-pointer ×1
performance ×1
pipe ×1
powershell ×1
qt ×1
qt-creator ×1
qt4 ×1
security ×1
struct ×1