C++偏门怪字记录_静态构造_写入注册表
一些CPP的偏门怪字记录_静态构造_写入注册表
volatile
可变的:简单来说,就是通知编译器这个变量是很危险的,时刻可变的东西。一般我们声明一个变量int a;为加速访问,编译器很可能将它丢到8个寄存器里进行读写,毕竟寄存器比内存访问快的多,但是,当我们多线程或一些特殊情况下,该值在寄存器中并得不到最新的更新。例如:我们获取系统时钟,这个值每毫秒都是变化,寄存器中的值是不可信的,加这个修饰将保证访问内存获取正确值,多线程也是一样,可能该值在内存中被其他线程修改,而访问寄存器将是个危险行为.
使用例子: volatile int a;
register
与上面那关键字相反,它是标识这个变量必须丢在寄存器中,寄存器的访问速度比内存快的多,即意味着这个变量,我们将会很频繁的读写,通常来说,可能在一些大的循环中对循环操作数用一下,但个人建议还是少用,它有非常多的陷阱。例如:
1:全局变量,静态变量不可用此关键字。
2:标准8086机上只有8个int寄存器,通常来说,比int长的变量都无法正确读写,例如float,double,longlong,__int64这些多半不支持register
3:不支持 & ,不在内存中,又如何取址?
4:最重要的,早期C不支持寄存器。
使用例子:register int a;
#pragma intrinsic
这个东西MSDN上解释不清,查了半天才知道,就是一个变相的 inline 而已。不同的是 inline 是编译器在预编译时就将该代码展开到调用处了,而这个指令是在函数被编译为2进制的obj后再嵌入到调用处,就这么个区别而已。说实话,我讨厌耍高的老外代码。
使用例子:#pragma intrinsic ( MyFun )
void MyFun(){ … }
//———————————————————————
下面补个有意思的问题,直到现在依旧没有人给我合理答案解释的:
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
A() : i ( 1 )
{
cout << "A的构造" << endl;
}
void Fun()
{
cout << "A的Fun" << endl;
}
int i;
};
class B
{
public:
B()
{
cout << "B的构造" << endl;
a.Fun();
cout << a.i << endl;
}
public:
static A a;
};
B b;
A B::a;
int main(int argc, char *argv[])
{
cout << b.a.i << endl;
return 0;
}
请问,最后输出什么,为什么这么输出。
//———————————————————————
因为总被人批判说不发技术东西,不象个程序员- -所以什么杂七杂八的东西都不整理丢上来好了,看起来象程序了吧……
下面一段代码可以将指定的程序丢入注册表进行开机启动。同样的类似代码可以做出注册表的其他改动,那就靠你自己研究了。
unsigned char szFilePath[1024];
::GetModuleFileName(NULL,(LPTSTR)szFilePath,1024);
HKEY hKey;
LONG lnRes = RegOpenKeyEx( HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0L,KEY_WRITE, &hKey );
if( ERROR_SUCCESS == lnRes )
{
lnRes = RegSetValueEx(hKey,
LPCTSTR( Application->ExeName.c_str() ),
0,
REG_SZ,
(szFilePath),
strlen((char*)szFilePath) + 1 );
}
//———————————————————————
今天写个小软件,结果发现文件IO操作一直不正确,结果发现一个很白痴的事情,UnicodeString的Sizeof遇到\n就自动结束了……
例如:现在有个字符串 “1234\n5678\n”,用sizeof( UnicodeString(“1234\n5678\n”)) = 4,而 UnicodeString(“1234\n5678\n”).Length() 则 = 10。真是白痴的C