似乎对于std :: bitset <1到32>,大小设置为4个字节.对于33到64的大小,它会直接跳到8个字节.不能有任何开销,因为std :: bitset <32>是偶数4个字节.
在处理位时我可以看到对齐字节长度,但是为什么bitset需要与字长对齐,特别是对于最有可能在内存预算紧张的情况下使用的容器?
这是在VS2010下.
浏览一些使用它的代码,这让我想知道.
if(condition) foo = bar();
condition && (foo = bar());
Run Code Online (Sandbox Code Playgroud)
这两段代码是否等于编译器?如果没有,它们会以什么方式不同?
我有一个基类和派生自它的类.基类Controllable充当输入循环的接口,并且从其派生的其他类在该循环中获取点以获取诸如按下键之类的事件.
class Controllable{
public:
virtual void setActive(bool state) { m_active = state; }
virtual void input(Event & e) =0;
private:
bool m_active;
};
class Button : public Controllable{
public:
void setActive(bool state){ /*do extra work*/ m_active = state; }
void input(Event & e) override;
};
Run Code Online (Sandbox Code Playgroud)
由于Button该类处理来自事件队列的事件,因此将其设置为非活动状态(将其从输入循环中取出)可能会导致它丢失重要事件(如未按下的键),因此需要额外的代码才能将其置于友好的非活动状态国家应该在以后再次活跃起来.
我的问题是,确保setActive始终具有切换m_active到正确状态的预期效果的最佳方法是什么,同时,除非需要附加额外需要的代码,否则不需要派生类来定义它?
我正在使用C++和OpenGL/SDL编写游戏,使用Visual Studio作为我的IDE.我没有Mac,也不熟悉平台.但我想向Mac用户发布所有相同内容.
我有三个问题.我可以在PC上编写和编译Mac程序吗?如果可以的话,这样做有什么可能的陷阱吗?最后,VS2010可以为Mac编译,还是需要使用其他编译器?
我想将大量数据(不同长度的整数数组,文本字符串库等)直接硬编码到可执行文件中,因此没有其他文件.
我的问题是,在C++中这样做最实用,最有条理的方法是什么?根据标题或源文件,我将在何处放置数据?我应该使用什么结构?
我意识到这不是处理数据的可接受方式.但幽默我!
我正在编写一个结构来描述我需要的常量值,并注意到一些奇怪的东西.
namespace res{
namespace font{
struct Structure{
struct Glyph{
int x, y, width, height, easement, advance;
};
int glyphCount;
unsigned char asciiMap[]; // <-- always generates an error
Glyph glyphData[]; // <-- never generates an error
};
const Structure system = {95,
{
// mapping data
},
{
// glyph spacing data
}
}; // system constructor
} // namespace font
} // namespace res
Run Code Online (Sandbox Code Playgroud)
Structure非纯化数组的最后两个成员如果它们本身就不会停止编译器.但如果它们都包含在结构的定义中,则会导致错误,说"类型不完整"
如果我给第一个数组一个大小,这将不再是一个问题.在这种情况下哪个不是问题,但我仍然好奇......
我的问题是,为什么我的struct中有一个unsized数组,但是有两个会导致问题?
我想介绍一系列的matrice操作,以了解他们将花多少时间.(当我想起CPU可以通过指令咀嚼的速度是多么愚蠢时,我更不倾向于考虑优化)
for(int n = 0; n < times; ++n){
// scrambled to miss the cache on purpose
matrix[ rand()%matrixLen ] * matrix[ rand()%matrixLen ];
}
Run Code Online (Sandbox Code Playgroud)
我的编译器不断优化这个表达式.有没有办法让它实际执行此代码,同时仍然保留所有其他优化?
我正在用 C 和 C++ 编写一些使用 Windows 控制台的可执行文件。
我试图让控制台在我的程序逻辑完成后不关闭......但不仅仅是暂停或等待,我希望它成为一个 cmd.exe 命令行控制台本身,准备接受新的提示.
本质上,我希望通过双击或拖放来运行我的程序的行为相当于点击winkey + r和运行:
cmd /k "program.exe [list of drag+drop files if any]"
(如果从命令行本身运行,则不会打开新控制台。)
这可能吗?
我一直在修补这个并找到了一个似乎有效的解决方案:
std::getenv("PROMPT") 将返回 0不从命令行运行时(我认为无论如何,不确定是否在所有情况下都适用),因此可用于根据可执行文件的运行方式来分叉逻辑。
以下代码至少对我有用,在我有限的实验中。如果它是从资源管理器中运行的,它会使用它的第一个实例来调用 cmd.exe 并带有参数,让该实例再次使用原始参数调用我们的程序。
int main(int argc, char * argv[]) {
// checks if we're in the explorer window, if so delegates to a new instance
if (std::getenv("PROMPT") == NULL) {
printf("Starting from explorer...\n");
std::string str("cmd /Q /k \"");
for (uint32 n = 0; n < argc; ++n) { …Run Code Online (Sandbox Code Playgroud) 我正在优化一种压缩算法,该算法使用跨 2 个字节的结构。但有时我希望它只解释 1 个字节,因为(我希望)映射到第二个字节的成员永远不会被写入或读取。
我是否能保证编译器不会访问第二个字节,只要 和zFmt永远wFmt不会被访问?如果不是,我可以编写一个静态断言,当这个假设错误时将停止编译吗?
struct Header {
uint8_t xFmt : 4;
uint8_t yFmt : 4;
uint8_t zFmt : 4; // must not be read/written when header is mapped to 1 byte
uint8_t wFmt : 4; // must not be read/written when header is mapped to 1 byte
};
static_assert( sizeof(Header) == 2 && alignof(Header) == 1, "alignment vital");
// --- usage ---
int main(){
// Header may be placed into memory where it …Run Code Online (Sandbox Code Playgroud) 这可能是一个奇怪的问题,但我需要知道OpenGL对绘制几何体的边缘(多边形,线条等)的别名是否"一致",这意味着它在不同的平台/硬件上看起来相同.
在这种情况下,混叠是"消除锯齿"旨在消除的锐边.我想要别名,并且希望将它用于需要混叠效果的像素完美的动画技术(它适用于精灵类效果).这是可行的,还是无法预测它在不同计算机上的别名?
c++ ×10
optimization ×2
windows ×2
arrays ×1
bit-fields ×1
c ×1
c++11 ×1
console ×1
graphics ×1
inheritance ×1
macos ×1
obfuscation ×1
opengl ×1
portability ×1
stl ×1