小编aJ.*_*aJ.的帖子

如何有效地使用预编译头文件(使用/ Yc和Yu选项)?

我们使用Visual Studio 2003(VC71)进行编译.为了减少编译时间,我们更改了构建脚本,以便为每个CPP文件生成预编译头文件(.pch).

makefile中使用的选项:

/Yc"StdAfx.h"
/Fp"StdAfx.pch"
Run Code Online (Sandbox Code Playgroud)

这样,目标的编译时间减少了30%.但是,任何人都可以帮助我理解即使每次编译每个CPP文件时生成pch文件,它如何减少编译时间.

还有,这是正确的方法吗?我们应该使用Yc和Yu组合吗?我不能使用/ Yu选项,因为pch文件应该至少生成一次.

c++ build precompiled-headers visual-studio

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

STL矢量是realloc的更好版本吗?

我相信在C++中,处理重新分配的更好方法是使用STL向量,因为它保证了连续的存储位置.

我有几个问题要理解其中的区别:

  1. 是否有任何情况我需要更喜欢realloc而不是vector?
  2. 还有什么(除了vector之外)相当于C++中的realloc吗?

谢谢,

c++ stl vector realloc

7
推荐指数
4
解决办法
6752
查看次数

在类中定义常量(用于常量表达式)的最佳方法?

我正在尝试为给定的用例为我的类定义一个常量BUFFER_LENGTH.

//1. Using preprocessor declaration
//#define BUFFER_LENGTH  12

//2.Global constant
//const int BUFFER_LENGTH  = 12;
class MyRequest
{
public:
    //3. Define an in-class constant
    //static const int BUFFER_LENGTH = 12;

    //4. Declare an enum constant
    enum 
    {
        BUFFER_LENGTH = 12
    };

    MyRequest()
    {
        strcpy(mBuffer, "TestString");
        printf("Buffer: %s, BUFFER_LENGTH = %d",mBuffer, BUFFER_LENGTH);
    }
private:
    char mBuffer[BUFFER_LENGTH];
};
Run Code Online (Sandbox Code Playgroud)

我刚刚列出了可以为类定义常量的不同方法.

1. Using Preprocessor constant
2. Using Global constant
3. Using in-class constant
4. using an enum.
Run Code Online (Sandbox Code Playgroud)

其中,哪个是定义给定用例的常量的最佳方法?我更喜欢使用枚举常量而非其他方法.有没有其他更好的方法,我错过了.

谢谢,

c++ constants

6
推荐指数
2
解决办法
3287
查看次数

是时候和VC6编译器说再见了吗?

最近我面临着指向VC6编译器的问题.

其中很少是:

  1. 函数try-block不起作用.相关问题
  2. 课堂常数不起作用.
  3. __FUNCTION_(获取函数名称的宏)不起作用
  4. 最新添加的是它不允许将void函数作为for_each的一部分传递.

以下示例未使用VC6编译器进行编译.它说"错误C2562:'()':'void'函数返回一个值".看起来VC6不喜欢将void函数传递给for_each.

class Temp
{
public:
    Temp(int i):m_ii(i)
    {}

    int getI() const
    {
        return m_ii;
    }

    void printWithVoid()
    {
        cout<< "i = "<<m_ii<<endl;

    }
    bool printWithBool()
    {
        cout<< "i = "<<m_ii<<endl;
        return true;
    }
private:
    int m_ii;
};

int main(void) 
{
    std::vector<Temp>  arrTempObjects;

    arrTempObjects.push_back(Temp(0));
    arrTempObjects.push_back(Temp(2));

    //Doesnot work, compiler error 
    std::for_each(arrTempObjects.begin(), arrTempObjects.end(), std::mem_fun_ref(&Temp::printWithVoid));

    //Works
    std::for_each(arrTempObjects.begin(), arrTempObjects.end(), std::mem_fun_ref(&Temp::printWithBool));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您是否遇到过与VC6.0相关的任何其他问题.解决这些问题的任何解决方法?还是时候改变编译器了?

c++ compiler-construction visual-c++-6

6
推荐指数
3
解决办法
3287
查看次数

是否有任何Win32 API可以在Windows中触发hibernate或suspend模式?

是否有任何Win32 API将机器置于休眠或挂起模式?

我读了MSDN,发现WM_POWERBROADCAST当电源管理事件发生时,消息会被广播.我想到了同样的模拟PostMessage(WM_POWERBROADCAST).这是正确的做法还是存在任何Win32 API来实现这一目标?

c++ windows sdk winapi suspend

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

获取文件上次修改时间并进行比较

我想要一个函数,它将获取一个文件并持续多少天,如果它比那个日期更早,将返回0否则1 ...这样的东西......

例如:

int IsOlder(TCHAR *filename, int days)
{

do operation.

If last modify date was older than days variable
return 0
else
return 1

}
Run Code Online (Sandbox Code Playgroud)

这是适用于Windows的MS VC++ 6.谢谢你们!

c++ visual-c++

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

构造函数的初始化列表中的异常处理

在我的项目中,我找到了一段代码,其中一个方法在构造函数的初始化列表中被调用.

Test2(Test* pTest):m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
    {
    }
Run Code Online (Sandbox Code Playgroud)

我发现Test2的用户可能会将NULL传递给构造函数.由于指针在未经验证的情况下使用,因此存在访问冲突的可能性.

这引发了我在构造函数的初始化列表中查看异常处理.我在其中一篇文章中发现尝试可以在初始化列表中使用.我写了一个小测试程序来测试这个概念:

//Test class stores the unique ID and returns the same with API getTestID
class Test
{
public:

    Test(int nID):m_nID(nID){
    }

    int getTestID() const
    {
            return m_nID;
    }
private:
    int m_nID;

};


class Test2
{
public:

    Test2(Test* pTest) 
        try :m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
    {
    }
    catch (...) 
    {
        cout<<"exception cought "<< endl;
    }

    void printDupID()
    {
        cout<<"Duplicate ID" << m_nDuplicateID << endl;
    }
private:

    Test* m_pTest;
    int m_nDuplicateID;
};

int main(int argc, char* argv[])
{ …
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling

5
推荐指数
2
解决办法
8952
查看次数

空载体的容量是多少?

看起来像个愚蠢的问题.但是,我的评论答案的SO问题让我重新思考一个.

[评论说,空载体的容量不必为零]

默认情况下,我的答案是0,因为矢量中没有元素.将容量保持为0是有意义的,并且在第一次分配时可以增加容量而不会有任何性能命中.

但标准并没有说明这一点.(我也查阅了Josuttis的书).

它纯粹是针对具体实现的吗?是否有任何STL供应商使用一些任意数字作为空载体的capcity?

有什么想法吗...

c++ stl vector

5
推荐指数
2
解决办法
2420
查看次数

可以将引用指针和指向实际变量的指针视为相同吗?

我最近在我的代码库中看到了下面的代码(下面给出的简化版本)并且有疑问:

class B;
class A
{
  public:
     A():m_A("testA"){}
     B& getB()
     {
       return m_B;
     }
     B* getBPtr() //== > written to explain the problem clearly
     {
       return &m_B;
     }
private:
    B m_B;
};

class B
{
  public:
    B(const std::string& name):m_Name(name){}
    std::string getName() const
    {
      return m_Name;
    }
private:
    std::string m_Name;
};

class C
{
 public:
   void testFunc(B* ptr)
   {
   }
};


int main()
{
  A a;
  C c;
 c.testFunc(&a.getB()); ===> is it equivalent to c.testFunc(a.getBPtr()) ?
}
Run Code Online (Sandbox Code Playgroud)
  1. 指向引用的指针和指向实际变量的指针可以被视为相同?
  2. 标准是否对变量地址使用的参考地址有任何可互换性.

c++ reference

5
推荐指数
2
解决办法
204
查看次数

编译器优化导致性能降低

我有一个奇怪的问题.我有以下代码:

template<clss index, class policy>
inline int CBase<index,policy>::func(const A& test_in, int* srcPtr ,int* dstPtr)
{
    int width = test_in.width();
    int height = test_in.height();

    double d = 0.0; //here is the problem
    for(int y = 0; y < height; y++)
    {

        //Pointer initializations

        //multiplication involving y
        //ex: int z = someBigNumber*y + someOtherBigNumber;
        for(int x = 0; x < width; x++)
        {
            //multiplication involving x
        //ex: int z = someBigNumber*x + someOtherBigNumber;
            if(soemCondition)
            {
                // floating point calculations
            }
            *dstPtr++ = …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++-6 compiler-optimization visual-c++

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