什么是KISS(保持简单,愚蠢)的方式来记住Boyce-Codd的正常形式是什么以及如何采用非标准化的表格和BCNF呢?
维基百科的信息:对我来说不是很有帮助.
例如,我可以将一组已编译成GCC-4.6的库与GCC-4.9混合使用.
我知道不同的编译器"品种"如VS不能与MinGW但可以不同代的同一编译器?问题可能会发生吗?如果是这样的话?
gcc 4.9允许使用以下代码,但gcc 4.8和clang 3.5.0拒绝它.
void foo(auto c)
{
std::cout << c.c_str();
}
Run Code Online (Sandbox Code Playgroud)
我进入warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
4.9但是在4.8和clang我得到error: parameter declared 'auto'
.
我想让一个活动进入IMMERSIVE模式并在它启动时隐藏顶部和底部系统栏.
在android开发者网站上,他们说我应该使用setSystemUiVisibility()
并提供SYSTEM_UI_FLAG_IMMERSIVE
和SYSTEM_UI_FLAG_HIDE_NAVIGATION
.
我怎么能OnCreate()
在活动的方法中这样做?我认为setSystemUiVisibility
Activity类中没有提供它,它应该在视图中发生.有解决方法吗?
UPDATE
确定根据门把我添加了以下行,但我没有看到任何更改,导航栏和按钮按钮仍然可见:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
}
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE);
}
//Rest of activity code
Run Code Online (Sandbox Code Playgroud) 我有一个宏在我的代码中使用,在调试模式下:
#define contract(condition) \
if (!(condition)) \
throw exception("a contract has been violated");
Run Code Online (Sandbox Code Playgroud)
...但在发布模式下:
#define contract(condition) \
if (!(condition)) \
__builtin_unreachable();
Run Code Online (Sandbox Code Playgroud)
这样做的原因assert()
是,在发布版本中,由于UB传播,编译器可以大量优化代码.
例如,使用以下代码进行测试:
int foo(int i) {
contract(i == 1);
return i;
}
// ...
foo(0);
Run Code Online (Sandbox Code Playgroud)
...在调试模式下抛出异常,但return 1;
在释放模式下为无条件生成程序集:
foo(int):
mov eax, 1
ret
Run Code Online (Sandbox Code Playgroud)
条件以及依赖它的一切都已经过优化.
我的问题出现在更复杂的条件下.当编译器无法证明条件没有副作用时,它不会将其优化出来,与不使用合同相比,这是一个严重的惩罚.
有没有办法表明合同中的条件没有副作用,所以总是优化出来?
我注意到在运行以下代码时,向量比bool数组慢得多.
int main()
{
int count = 0;
int n = 1500000;
// slower with c++ vector<bool>
/*vector<bool> isPrime;
isPrime.reserve(n);
isPrime.assign(n, true);
*/
// faster with bool array
bool* isPrime = new bool[n];
for (int i = 0; i < n; ++i)
isPrime[i] = true;
for (int i = 2; i< n; ++i) {
if (isPrime[i])
count++;
for (int j =2; i*j < n; ++j )
isPrime[i*j] = false;
}
cout << count << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以让我vector<bool> …
我有一个同事正在计划一个新应用程序的数据库,该应用程序将包含多个表,每个表包含30多个字段.这太过分吗?也许我只是不够了解企业.
编辑:此外,很多字段都是选项类型的东西(比如在请求表单上,你希望你的小部件是黄色还是绿色,他有一个带有枚举的'color'字段).随着时间的推移,很可能会添加或删除这些内容.我没有真正完成数据库设计,并试图远离它自己,所以也许我是完全愚蠢的,但肯定有更好的方法这样做?
我使用Boost Test框架对我的C++代码进行单元测试,并想知道是否可以测试函数是否会断言?是的,听起来有点奇怪,但请忍受我!我的许多函数在输入时检查输入参数,断言它们是否无效,并且测试它是有用的.例如:
void MyFunction(int param)
{
assert(param > 0); // param cannot be less than 1
...
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
BOOST_CHECK_ASSERT(MyFunction(0), true);
BOOST_CHECK_ASSERT(MyFunction(-1), true);
BOOST_CHECK_ASSERT(MyFunction(1), false);
...
Run Code Online (Sandbox Code Playgroud)
你可以检查使用Boost测试抛出的异常,所以我想知道是否还有一些断言魔法......
我在论坛上看到很多人告诉他们要避免这个system()
功能,比如说system("cls")
.我不明白为什么.
请告诉我为什么我应该避免这个功能.而且,由于clrscr()
不能与CodeBlocks一起使用,有什么其他方法可以在不使用该system()
功能的情况下清除屏幕?
Clang 3.9非常重用临时使用的内存.
此代码是UB(简化代码):
template <class T>
class my_optional
{
public:
bool has{ false };
T value;
const T& get_or_default(const T& def)
{
return has ? value : def;
}
};
void use(const std::string& s)
{
// ...
}
int main()
{
my_optional<std::string> m;
// ...
const std::string& s = m.get_or_default("default value");
use(s); // s is dangling if default returned
}
Run Code Online (Sandbox Code Playgroud)
我们有大量类似上面的代码(my_optional
只是一个简单的例子来说明它).
因为UB所有的clang编译器从3.9开始重用这个内存,而且它是合法的行为.
问题是:如何在编译时检测这种悬空引用,或者在运行时检测清理程序?没有clang消毒剂可以检测到它们.
UPD.请不要回答:"使用std::optional
".仔细阅读:问题不是关于它.
UPD2.请不要回答:"你的代码设计很糟糕".仔细阅读:问题不是代码设计.
c++ ×7
gcc ×3
assert ×2
c++11 ×2
database ×2
gcc4.9 ×2
abi ×1
android ×1
android-view ×1
auto ×1
bcnf ×1
bitvector ×1
boost ×1
boost-test ×1
c ×1
c++14 ×1
clang++ ×1
gcc4.6 ×1
optimization ×1
performance ×1
system ×1
unit-testing ×1
vector ×1