C代码是否有任何方法可以判断它是否在乘法快速的架构上编译?是否有一些宏__FAST_MULT__或在这些架构上定义的东西?
例如,假设您正在实现一个函数,通过shift-and-add方法确定64位整数的汉明权重.有两种最佳算法:一种需要17次算术运算,而另一种只需要12次,但其中一种是乘法运算.因此,如果您在硬件上运行,第二种算法的速度提高了30%,其中乘法所需的时间与添加时间相同 - 但是,在将乘法实现为重复加法的系统上,要慢得多.
因此,在编写这样的函数时,能够在编译时检查是否是这种情况并在适当时在两种算法之间切换是有用的:
unsigned int popcount_64(uint64_t x) {
x -= (x >> 1) & 0x5555555555555555; // put count of each 2 bits into those 2 bits
x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); // put count of each 4 bits into those 4 bits
x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f; // put count of each 8 bits into those 8 bits
#ifdef __FAST_MULT__
return (x …Run Code Online (Sandbox Code Playgroud) 考虑C++中的以下代码:
struct A {A(int);};
A foo() {return static_cast<A>(0);}
A x = foo();
Run Code Online (Sandbox Code Playgroud)
这里static_cast<A>(0)通过标准[5.2.9-4]创建一个临时对象,它是一个prvalue.标准[12.2-1]说
类型的临时数在各种上下文中创建:绑定对prvalue的引用(8.5.3),返回prvalue(6.6.3),创建prvalue的转换(4.1,5.2.9,5.2.11,5.4) ,抛出异常(15.1),进入处理程序(15.3),以及一些初始化(8.5).
那么return语句会再次创建一个临时对象吗?
顺便说一下,任何人都可以告诉我标准是否保证隐式类型转换会创建一个临时对象?
任何人都可以解释为什么这段代码编译:
typedef struct longlong
{
unsigned long low;
long high;
}
longlong;
typedef longlong Foo;
struct FooStruct
{
private:
Foo bar;
public:
void SetBar(Foo m)
{
bar = m;
}
Foo GetBar()
{
return bar;
}
};
int main()
{
FooStruct f;
Foo m1 = { 1,1 };
Foo m2 = { 2,2 };
f.SetBar(m1);
f.GetBar() = m2; // Here I'd expect an error such as
// "error: lvalue required as left operand of assignment"
}
Run Code Online (Sandbox Code Playgroud)
我预计编译失败的原因与error: …
我正在写一个小程序来保存笔记本电脑的电池,我现在可以在电源方案之间切换PowerSetActiveScheme.
下一步是在Windows 10中控制电池保护程序.虽然我可以使用它来读取它的状态,但GetSystemPowerStatus我找不到以编程方式启用/禁用它的方法.Windows API中是否有任何功能可以执行此操作?
我总是想知道为什么警告passing argument 1 from of 'foo' makes pointer from integer without a cast和警告只是警告而不是错误.
实际上这些警告几乎总是错误.
有人知道这背后的想法是什么?
例:
int foo(int *bar)
{
*bar = 42;
}
void bar()
{
int n = 0;
foo(n); // this is obviously an error
...
}
Run Code Online (Sandbox Code Playgroud) 我必须重用一个目前在eclipse中开发的主要C++项目,使用CDT,mingw和cdt托管构建功能(没有外部makefile或构建环境).该项目本身由许多子项目组成.
我想将该构建集成到一个持续集成服务器(即jenkins),因此能够自动化无头构建.
到目前为止,我设法检查了项目(很容易从jenkins)并使用eclipse使用以下命令构建无头模式:
C:\prog\EclipseCdt\eclipse -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -import %WORKSPACE%\project1 -import %WORKSPACE%\project2 -import %WORKSPACE%\project3 -build all
Run Code Online (Sandbox Code Playgroud)
然而,这还不够:
make在Linux或devenvWindows上一样)知道如何有这种行为吗?
注意:
为什么由类向导生成的消息映射中的函数地址明确提到了类的名称?
例如:
ON_BN_CLICKED(IDC_CHECK1, &CMyDlg::OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)
代替:
ON_BN_CLICKED(IDC_CHECK1, &OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)
甚至:
ON_BN_CLICKED(IDC_CHECK1, OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)
所有三种变体都能正确编译
这只是好奇心.
以下程序编译好并按预期工作.它的输出是:
1
2
#include <stdio.h>
class Foo
{
public:
void Bar(const char* b, ...) { printf("1\n"); };
void Bar(int a, const char* b, ...) { printf("2\n"); };
};
int main()
{
Foo foo1;
foo1.Bar("Test", "xx", 1, 2);
foo1.Bar(1, "xx", "xx", 2, 2);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我改变int的第二个参数Bar的功能为bool和foo1.Bar(1, "xx", "xx", 2, 2);成foo1.Bar(true, "xx", "xx", 2, 2);,那么,下面一行将无法编译,我得到的错误:'Foo::Bar': 2 overloads have similar conversions:
foo1.Bar("Test", "xx", 1, 2);
Run Code Online (Sandbox Code Playgroud)
整个程序不编译:
#include <stdio.h>
class Foo
{
public: …Run Code Online (Sandbox Code Playgroud) 我正在测试Windows API的菜单状态(禁用,灰显,检查......)但是有些东西我不明白.该文件,各国MF_DISABLED不灰色的项目,但这里是我得到:
使用此代码:
HMENU menuBar = CreateMenu();
HMENU hopMenu = CreateMenu();
AppendMenuW(menuBar, MF_POPUP, (UINT_PTR)hopMenu, L"hop");
AppendMenuW(hopMenu, MF_STRING, 0, L"Enabled");
AppendMenuW(hopMenu, MF_STRING | MF_DISABLED, 1, L"Disabled");
AppendMenuW(hopMenu, MF_STRING | MF_GRAYED, 2, L"Grayed");
AppendMenuW(hopMenu, MF_STRING | MF_CHECKED, 3, L"Checked");
AppendMenuW(hopMenu, MF_STRING | MF_DISABLED | MF_CHECKED, 4, L"Disabled && Checked");
AppendMenuW(hopMenu, MF_STRING | MF_DISABLED | MF_GRAYED, 5, L"Disabled && Grayed");
AppendMenuW(hopMenu, MF_STRING | MF_CHECKED | MF_GRAYED, 6, L"Checked && Grayed");
SetMenu(hwnd, menuBar);
Run Code Online (Sandbox Code Playgroud)
如何禁用未显示灰色的禁用菜单项?
我想将指向Object类的共享指针存储在向量中:
测试代码:
#include <vector>
#include <iostream>
#include <memory>
using namespace std; // only for brevity
class Object
{
public:
int n;
Object(int n) : n(n) { cout << "Object(" << n <<")\n"; }
~Object() { cout << "~Object(" << n << "))\n"; n = 0xdddddddd; }
};
void Test()
{
std::shared_ptr<Object> p1(make_shared<Object>(Object(123)));
std::vector<shared_ptr<Object>> v;
cout << "before push_back\n";
v.push_back(std::make_shared<Object>(Object(2)));
v.push_back(p1);
cout << "after push_back\n";
cout << "Vector content:\n";
for (auto& p : v)
cout << " " << …Run Code Online (Sandbox Code Playgroud)