小编Poo*_*ria的帖子

类的对象成员的顺序是否会对性能产生影响?

可能某个类对象的二进制体系结构中的成员的顺序会对使用该类的应用程序的性能产生影响吗?我想知道如果答案是肯定的,如何决定POD成员的顺序,因为程序员通过他们的声明顺序定义了成员的顺序

c++ binary performance class object

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

在处理易失性存储器位置时,编译器必须遵循什么规则?

我知道当从几个线程或进程写入的内存位置读取时,volatile属性应该用于该位置,就像下面的一些情况一样,但我想知道更多关于它对编译器的实际限制,基本上是什么规则编译器在处理这种情况时必须遵循,并且有任何例外情况,尽管可以同时访问存储器位置,但程序员可以忽略volatile关键字.

volatile SomeType * ptr = someAddress;
void someFunc(volatile const SomeType & input){
 //function body
}
Run Code Online (Sandbox Code Playgroud)

c++ memory compiler-construction rules volatile

12
推荐指数
4
解决办法
5157
查看次数

我们可以在即将到来的c ++ 0x标准下通过这种语法将数组作为参数传递给函数吗?

假设我们有以下功能:

void someFunction(int * araye){
 for (int i=0;i<5;i++)
  cout <<araye[i]<<' ';
 cout <<'\n';
}
Run Code Online (Sandbox Code Playgroud)

在即将到来的c ++ 0x标准下,我们可以通过以下语法将数组传递给此函数吗?:

someFunction({1,2,3,4,5});
Run Code Online (Sandbox Code Playgroud)

如果这是真的,我们甚至可以在任何情况下使用这种语法,其中数组元素来自如下的POD类型:

class Test{
 int adad1;
 int adad2;
};
void someFunction(Test * araye){
 for (int i=0;i<3;i++)
  cout <<araye[i].adad1<<'-'<<araye[i].adad2<<' ';
 cout <<'\n';
}
someFunction({{1,2},{3,4},{5,6}});
Run Code Online (Sandbox Code Playgroud)

编辑 - >之后人们说:
所以你们告诉大括号之间的表达式基本上会被视为一个初始化器列表,并建议使用一个额外的函数将指针拉出初始化列表并将其传递给预期的函数,但是这个方法在我看来像是一个hack,能够使用我的预期函数与该表达式作为参数,据说我认为我不应该使用该表达式作为参数,当我的预期函数参数是单个指针时,或者可能有另一种方法来使用该表达式?.

c++ arrays syntax function c++11

11
推荐指数
2
解决办法
2551
查看次数

编译器在cpu寄存器中将这样的结构传递给函数是否有意义?

我想知道某种结构是否包含多个原语但其总大小小于或等于单个cpu寄存器的大小(如4字节寄存器),编译器是否有意义将它放入在通过值或引用函数传递它时,在其中一个4字节寄存器中,而不是在被调用堆栈上复制它或传递指针,并且通常在将多于一个原语传递给函数时一个数组或一个结构会传递到一个cpu寄存器中派上用场了吗?

这种结构的样本:

struct sample{
 public:
  char char1;
  char char2;
};
Run Code Online (Sandbox Code Playgroud)

将结构传递给函数的示例:

void someFunc(const sample input){
 //whatever
}
void someFunc(sample input){
 //whatever
}
void someFunc(sample & input){
 //whatever
}
void someFunc(const sample & input){
 //whatever
}
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction function parameter-passing cpu-registers

8
推荐指数
2
解决办法
416
查看次数

浮点算术运算的精度是多少?

考虑下面两个非常简单的乘法:

double result1;
long double result2;
float var1=3.1;
float var2=6.789;
double var3=87.45;
double var4=234.987;

result1=var1*var2;
result2=var3*var4;
Run Code Online (Sandbox Code Playgroud)

默认情况下,乘法是否以高于操作数的精度完成?我的意思是,在第一次乘法的情况下,它是以双精度完成的,如果在x86架构中第二次,它是以80位扩展精度完成的,或者我们应该在表达式中将操作数转换为更高的精度,如下所示?

result1=(double)var1*(double)var2;
result2=(long double)var3*(long double)var4;
Run Code Online (Sandbox Code Playgroud)

其他操作(添加,除法和余数)怎么样?例如,当添加两个以上的正单精度值时,如果用于保存表达式的中间结果,则使用双精度的额外有效位可以减少舍入误差.

c++ floating-point arithmetic-expressions rounding floating-point-precision

7
推荐指数
2
解决办法
1124
查看次数

以类似于初始化字符串文字的方式初始化char数组

假设我已经跟随char数组的初始化:

char charArray[]={'h','e','l','l','o',' ','w','o','r','l','d'};
Run Code Online (Sandbox Code Playgroud)

我还有一个字符串文字的初始化:

char stringLiteral[]="hello world";
Run Code Online (Sandbox Code Playgroud)

第一个数组和第二个字符串的内容之间的唯一区别是第二个字符串的末尾有一个空字符.

当初始化一个char数组的问题时,是否有一个宏或某些东西允许我们将初始化文本放在两个双引号之间但是数组没有得到额外的空终止字符?

对我来说没有意义的是,当不需要终止空字符时,我们应该使用首先提到的初始化的语法,并为初始化文本中的每个字符写两个单引号,以及用于分隔字符的virgule标记.

我应该补充一点,当我想要一个char数组时,我也不应该明白我不想将它用于依赖于字符串文字的函数以及使用字符串文字结果的所有功能都不是考虑我.

我很感谢你的回答.

c++ arrays string initialization literals

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

编译器是否可以生成代码以在执行期间卸载部分代码段?

除了在运行时提供加载/卸载方法或函数的能力的Dll概念之外,我想知道编译器是否会说出类似的东西,好吧,因为代码段的这个特定部分占用了相当大的空间并且是在程序执行过程中,在此之后永远不会再次使用,在程序执行期间到达该特定点之后生成一些代码来卸载代码段的那部分是很好的,这样代码段占用的整体空间就会变小.它是虚构的还是可能发生的?

c++ compiler-construction segment

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

会不会通过引用将整数类型的变量传递给函数比通过值更有效?

我知道在将一个任何整数类型的变量(如int,double,long double等)传递给函数时会说; 它应该通过值完成,但我很好奇,从汇编点(性能方面或空间方式),当传递一个大于指针的整数类型的变量时,不会出现这种情况在我的平台上,它的大小为8字节,大小比指针大小为4字节大; 通过引用会更有效率?

c++ performance assembly function parameter-passing

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

我该怎么做这个明确的专业化?

以下设计可能吗?:

template <typename T>
class Test{
 public:
  template <typename Z>
  void doSomething();
  //rest of things
 private:
  T obj;
  //some things
};
Run Code Online (Sandbox Code Playgroud)

现在,如果可能的话,我会为doSomething做一些明确的专业化,以便最后我会有一些版本如下:

void doSomething<int>(){
 //do something
}
void doSomething<double>(){
 //do something
}
...etc
Run Code Online (Sandbox Code Playgroud)

这似乎不可能我找不到任何语法来完成这项工作然后我想也许设计应该如下所示,以便所有模板参数应该传递给模板类本身:

template <typename T,typename Z>
class Test{
 public:
  void doSomething();
  //rest of things
 private:
  T obj;
  //some things
};
Run Code Online (Sandbox Code Playgroud)

然后我尝试了部分特化,甚至没有编译:

template <typename T>
void Test<T,int>::doSomething(){
 //do something
}
template <typename T>
void Test<T,double>::doSomething(){
 //do something
}
...etc
Run Code Online (Sandbox Code Playgroud)

我为显式特化得到了以下错误:
错误#1:类模板名称后面的模板参数列表必须按照模板参数列表中使用的顺序列出参数.
错误#2:'Container1':模板参数太少.

c++ templates explicit-specialization

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

堆栈帧的大小总是固定的?

在 C++ 程序执行期间,特定函数的堆栈帧是否始终具有恒定大小,或者在某些情况下允许编译器进行动态堆栈管理,类似于 alloca() 函数的作用?为了更好地描述它,我的意思是堆栈帧中特定局部变量或对象的偏移量可能会在函数的不同执行时发生变化

c++ size callstack function

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